有人能指出gcc -D_FORTIFY_SOURCE=1和之间的区别-D_FORTIFY_SOURCE=2吗?我想=2更安全吗?我找不到一个逐点列出差异的列表.
我还读过-D_FORTIFY_SOURCE=2应该使用的-O2,否则并非所有功能都可用.此外,我还没有找到一个列表,详细说明回归.我特别感兴趣的是编译-Os目标是一个没有那么多闪存的设备.
有关记录在哪里的任何提示欢迎!
来自Linux/gcc/clang我发现自己在Windows/Visual Studio上的工作越来越多.
我真正缺少的是地址清理器(边界检查,泄漏,免费后使用,......).我做了一些研究,并尝试了一些事情,但没有找到完整(功能明智)和可靠的替代品.我以Dr.Memory为例,但了解到它对基于Qt的程序不起作用(至少在Windows 10上不行).
那么如何在Windows/MSVC上获得类似地址清理程序的功能呢?
我试图更深入地了解linux的虚拟内存管理器.如果找到一本名为"了解Linux虚拟内存管理器[1]"的书,由Mel Gorman编写,看起来相当精细.不幸的是它基于2.4内核系列所以它的那种古老.
有谁读过这本书?它仍然相关吗?备择方案?
我尝试使用GNU链接器功能“ -wrap = symbol”来拦截大型应用程序对malloc()的所有调用。该应用程序正在使用一大堆共享库。
链接器阶段如下所示:
g++ -Wl,-wrap=malloc -o samegame .obj/main.o .obj/qrc_samegame.o -lQt5Quick -lQt5Qml -lQt5Network -lQt5Gui -lQt5Core -lGL -lpthread
我的包装器看起来像这样:
extern "C" {
void *
__real_malloc(size_t c);
void *
__wrap_malloc(size_t c)
{
printf("my wrapper");
return __real_malloc (c);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我看到包装程序被要求直接从我的应用程序完成的malloc调用。不会钩住在共享库之一中完成的malloc调用。
难道我做错了什么?
我有一个类Node:
class Node {
public:
int item;
Node * nextLink;
};
Run Code Online (Sandbox Code Playgroud)
在函数外部我声明了一个Node指针:
Node * newNode;
Run Code Online (Sandbox Code Playgroud)
然后,我将此指针传递给函数foo:
void foo(Node * node) {
node = new Node();
node->item = 1;
Node * anotherNode = new Node();
anotherNode->item = 2;
node->nextLink = anotherNode;
}
Run Code Online (Sandbox Code Playgroud)
实际通话:
foo(newNode);
Run Code Online (Sandbox Code Playgroud)
在foo结束时(但在现有之前),我可以看到node-> item和node-> nextLink指向正确的位置.但是,当从foo返回时,我检查newNode,并且该项是正确的,但nextLink不在那里.
有什么建议?谢谢