这个QSort不安全吗?

时间:2014-02-12 19:43:44

标签: c++ crash access-violation qsort

我正在调查我们计划中的崩溃。我正在看另一个程序员编写的QSort。我想讨论为什么这对他们来说不安全,但他们对C ++的技术理解比我更好,并希望获得尽可能多的信息。我无法粘贴实际代码,但我会尽力重新创建必需品。

我可以想到为什么这是不安全的几个原因,但想要更具体的谈话要点。

QSort在两个具有不同结构的数组上运行,第一个元素是另一个名为MyString的结构。否则结构的其他元素是不同的。例如:

struct SItemA
{
    MyString ItemId;
    INT IntFoo;
}

struct SItemB
{
    MyString ItemId;
    FLOAT FloatFoo;
}

这是一个性能关键应用程序,因此不使用STL字符串/数组。我不知道如何实现字符串/数组的细节,但它们是可靠的,并且受到更大社区的测试,并且不是我怀疑的焦点。

static int
IDCompare(
    void const* inA,
    void const* inB)
{
    MyString const* a = (MyString const*)inA;
    MyString const* b = (MyString const*)inB;

    return MyStrCmp(**a, **b);
}

appQsort(aItems.GetData(), aItems.Num(), sizeof(SItemA), IDCompare);
appQsort(bItems.GetData(), bItems.Num(), sizeof(SItemB), IDCompare);

QSort天真地假设结构的地址与MyString元素的地址相同。据我所知,这是正确的(现在),因为C ++编译器保证结构元素按顺序存储(只要结构符合POD的标准,就我所知道的那样)。< / p>

我认为这是用这种方式编写的,以避免为每个结构编写两个不同版本的QSort。

我的主要观点是,如果结构的实现发生变化(字符串被(重新)/移动),程序将以不可预测的方式运行,甚至可能导致内存违规。

假设结构定义没有改变。 QSort是否还有其他问题?

0 个答案:

没有答案