禁用特定编译器优化

时间:2014-08-12 15:12:18

标签: c optimization compiler-construction

我使用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。但它不是导致泄漏或崩溃,而是像null终止一样工作。有什么方法可以解决这个问题吗? ..而不是通过使用+1的5543行代码。

1 个答案:

答案 0 :(得分:5)

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

    strcpy(local, (char*)str);

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


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

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