Fra*_*fer 5 c++ gdb valgrind vtable address-sanitizer
令 vptr 为指向 vtable 的指针,该 vtable 随其类受虚拟函数约束的对象一起携带。
“vptr”的改变可能不是预期的行为。然而,这种更改不能被检测为非法内存访问,因为指针位于已分配内存的边界内。据我所知,“Efence”和“valgrind/memcheck”不会有帮助。
然而,意外的 vptr 更改可能会导致严重的问题。如果 vptr 被更改为指向任意内存,则删除运算符可能会立即导致分段错误。
是否有任何东西可以在 vtable 或指向 vtable 的指针上设置“守卫”,以便监视任何更改?
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;
}
Run Code Online (Sandbox Code Playgroud)
编译并执行...
> clang++ -fsanitize=undefined -fsanitize=vptr tmp.cpp -o test
> ./test
Run Code Online (Sandbox Code Playgroud)
在调用“virtual ~X()”时检测违规行为。
<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
Run Code Online (Sandbox Code Playgroud)
同样不适用于
...
X* x_p = new X();
memset((void*)x_p, 0, sizeof(X));
delete x_p;
printf("<before exit>\n");
...
Run Code Online (Sandbox Code Playgroud)
vptr 损坏检测器应在所有对象的 vptr-s 上设置某种类型的“观察点”。
| 归档时间: |
|
| 查看次数: |
1032 次 |
| 最近记录: |