Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检测C+的修改+;对象';运行时指向vtable的指针?_C++_Gdb_Valgrind_Vtable_Address Sanitizer - Fatal编程技术网

C++ 如何检测C+的修改+;对象';运行时指向vtable的指针?

C++ 如何检测C+的修改+;对象';运行时指向vtable的指针?,c++,gdb,valgrind,vtable,address-sanitizer,C++,Gdb,Valgrind,Vtable,Address Sanitizer,让vptr作为指向随对象携带的vtable的指针 其类受虚拟函数约束 “vptr”的变更可能不是预期行为。 但是,此类变更不能被视为非法 内存访问,因为指针位于 已分配内存。”“Efence”和“valgrind/memcheck”不会 帮助——据我所知 然而,意外的vptr变更可能会导致严重的问题。 如果vptr更改为指向任意内存,则删除 操作员可能会立即导致分段故障 是否存在任何可能在vtables上设置“防护”的内容,或者 在指向vtables的指针上,以便监视任何更改 Clang++似乎

让vptr作为指向随对象携带的vtable的指针 其类受虚拟函数约束

“vptr”的变更可能不是预期行为。 但是,此类变更不能被视为非法 内存访问,因为指针位于 已分配内存。”“Efence”和“valgrind/memcheck”不会 帮助——据我所知

然而,意外的vptr变更可能会导致严重的问题。 如果vptr更改为指向任意内存,则删除 操作员可能会立即导致分段故障

是否存在任何可能在vtables上设置“防护”的内容,或者 在指向vtables的指针上,以便监视任何更改

Clang++似乎不能完成全部工作。给定

#include <string.h>
#include <stdio.h>
struct X { virtual ~X() {} };
int main(int argc, char** argv)
{
    X x;
    memset((void*)&x, 0, sizeof(X));
    printf("<before exit>\n");
    return 0;
}
调用“virtual~X()”时检测违规行为


:运行时错误:对地址0xbfe30ab8的成员调用,该地址不指向“X”类型的对象
0xbfe30ab8:注意:对象具有无效的vptr
74 0b e3 bf 00 00 4d 46 48 b7 74 0b e3 bf 01 00 00 00 00 00
^~~~~~~~~~~
无效的vptr
相同的不适用于

 ...
    X* x_p = new X();
    memset((void*)x_p, 0, sizeof(X));
    delete x_p;
    printf("<before exit>\n");
 ...
。。。
X*X_p=新的X();
memset((void*)x_p,0,sizeof(x));
删除x_p;
printf(“\n”);
...

vptr损坏检测器应在所有对象的vptr-s上设置某种类型的“观察点”

我不知道为什么会关门。关于这个问题,.rodata中的vtables不是吗?同意,不理解为什么这个问题被搁置。2) 好的,一个对象携带一些指向其特定类的vtable的指针。如果此指针损坏,则对象不起作用。vtable本身不一定要随身携带。问题仍然存在。但请注意,您询问的是vtable本身,而不是vptr。例如,“虚拟析构函数在vtable中的条目被恶意覆盖”显然是关于vtable的。不,vptr是特殊的,因为它的更改通常不会被任何类型的断言或一致性检查检查检查。此外,我不知道在任何情况下,vptr的修改是可取的。因此,检测其变化是有意义的。问题的描述提供了足够的论据来支持“vptr”是特殊的观点。同样,它应该是恒定的,它是隐式存在的,并且对功能至关重要。对它的更改在程序代码中无法明确检测到,与之相关的错误可能很难找到。
<before exit>
<unknown>: runtime error: member call on address 0xbfe30ab8 which does not point to an object of type 'X'
0xbfe30ab8: note: object has invalid vptr
 74 0b e3 bf  00 00 00 00 4d 46 48 b7  74 0b e3 bf 01 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00
              ^~~~~~~~~~~
              invalid vptr
 ...
    X* x_p = new X();
    memset((void*)x_p, 0, sizeof(X));
    delete x_p;
    printf("<before exit>\n");
 ...