gpt4 book ai didi

c - 禁用特定的编译器优化

转载 作者:行者123 更新时间:2023-12-03 17:12:59 26 4
gpt4 key购买 nike

我使用 C::B 在 Win7 的 MinGW 的 gcc 上编译了以下测试代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* Func. prototype */
char* returnString (void *str);

int main()
{
printf("%s", returnString("Hello World!!!!!!!!!!!!"));

return 1;
}

char* returnString (void *str)
{
char *local = malloc(strlen((char*)str));

strcpy(local, (char*)str);

return local;
}

默认情况下,分配会导致泄漏/u/b..,因为我必须在空终止符所在的位置分配一个空闲字节+1。但它不会导致泄漏或崩溃,而是像空终止一样工作。有什么办法可以禁用这个吗?..而不是使用 +1 的 5543 行代码。

最佳答案

下面的行会导致缓冲区溢出,因为之前计算要分配的大小时缺少 + 1

    strcpy(local, (char*)str);

缓冲区溢出比内存泄漏严重得多。不幸的是,缓冲区溢出不会系统地导致程序崩溃。它调用未定义的行为,这意味着任何事情都可能发生,包括程序继续运行,就像您分配了足够大的 block 一样。这不是编译器优化:它可以在任何优化级别发生(或不发生),并且程序员对发生的情况几乎没有控制权。请参阅下面的一些部分解决方案。


获取许多缓冲区溢出的诊断消息的一种方法是使用 Valgrind正常编译后执行程序。

或者,最新版本的 Clang 和 GCC 包含“地址清理程序”功能,通过 -fsanitize=address 激活,该功能会在生成的代码中插入一些可能检测到问题的指令。我没有使用过此功能,但文档是 available .

关于c - 禁用特定的编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25267953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com