【问题标题】:CLion doesn't warn when write access violation is made发生写访问冲突时,CLion 不会发出警告
【发布时间】:2021-04-07 01:16:01
【问题描述】:

我在 Windows 的 CLion 和 Cygwin 工具链(gcc 和 gdb)中运行了这个 C 代码,我尝试写入未分配的 str[5]:

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

int main() {
    char * str = malloc(4);
    str[5] = 'a';
    printf("%c\n", str[5]);
    return 0;
}

但是,它运行时没有任何错误(我预计会出现内存访问冲突和我没有释放分配的指针的警告)。

这是 CMakeLists.txt 的配置方式(我刚刚添加了 CMAKE_C_FLAGS 行):

cmake_minimum_required(VERSION 3.17)
project(myproject C)

set(CMAKE_C_STANDARD 11)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror")

add_executable(myproject main.c)

为什么它没有为该内存访问引发警告/错误?我该如何解决?

【问题讨论】:

  • 不是完全重复的,因为上面的标签是 C++,但答案是一样的:stackoverflow.com/questions/1239938/…
  • 您没有收到访问冲突消息,因为没有访问冲突。超出数组范围的访问是未定义的行为(google that),这可能会也可能不会导致访问冲突。这个问题有很多重复。并且不释放指针不会在特殊调试环境之外给出任何诊断消息。
  • @Chase 当我在 Visual Studio 中编写相同的代码时,我会抛出异常。我在 CLion 中也有同样的期待。
  • @nscode 其实就是未定义行为的意思。它可能会起作用,或者它可能会从你的鼻子里喷出龙。
  • @nscode 请注意,运行时“异常”与编译时警告(这是您所要求的)根本不同。运行时异常与您使用的编辑器/编译器无关。这取决于您的程序本身执行了哪些指令,以及操作系统/内核采取了哪些步骤来防止您的程序可能损坏系统。

标签: c gcc clion jetbrains-ide


【解决方案1】:

您不能访问未分配的内存。同时,您的编译器/运行时不需要阻止您这样做。

C 中没有手牵手,如果你愿意,可以向自己的脚开枪。

【讨论】:

  • 当我在 Visual Studio 中编写相同的代码时,会引发异常。我在 CLion 中也有同样的期待。
  • 这是未定义的行为,任何事情都可能发生。
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 2017-07-06
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多