标签: gcc-warning

有没有办法让gcc或clang警告失踪的'其他'?

如果我不处理if语句的其他条件,我想让编译器警告我.这是否存在于clanggcc中

为了澄清,我并不是想让我的所有源代码开启.但是,有时整个文件或大量的代码,我根本无法承受不考虑每一个其他块的设计.因此,我想,我真的在寻找一个pragma,我可以打开和关闭以启用和禁用几千行非常重要的代码.

想象它是一个自动代码审查或静态分析工具.

要说编译器不能这样做,因为它是合法的......在实践中不是问题.我见过的每个C/C++编译器都会很乐意发出大量警告,以防止在语法和语义上完全有效的代码.(例如在gcc中,-Wunused-value,-Wunused-label,-Wunreachable-code等...)

c++ syntax gcc clang gcc-warning

3
推荐指数
1
解决办法
402
查看次数

如何分析make输出以获取编译器警告?

我正在为Windows,Mac OS X和Linux开发跨平台C ++应用程序。开发在Windows上完成,然后测试了与Mac OS X和Linux上的gcc的兼容性。在Windows上,我们使用Visual Studio进行编译;在Linux和Mac OS X上,我们使用Makefile。

有没有一种方法可以过滤每个项目/模块的编译器警告?大多数项目都有自己的Makefile,然后为子项目调用qmake。在这种情况下,他们是收集编译器警告和错误的工具还是证明方法?理想情况下,我希望有html输出,每个项目都有一个摘要,而实际错误则有一个详细页面。

gcc makefile compiler-warnings gcc-warning

3
推荐指数
1
解决办法
1873
查看次数

取消引用类型双关指针将破坏严格别名规则:字节数组到数字

我已经阅读了许多有关此警告的问题(取消引用类型双关指针会破坏严格别名规则取消引用类型双关指针会破坏严格别名规则 [-Wstrict-aliasing]严格别名规则是什么?“取消引用类型双关指针将破坏严格的别名规则”警告和其他人)并且对我的警告完全感到困惑。

所以我有一个结构:

typedef struct {
    unsigned char precision;
    unsigned char scale;
    unsigned char array[33];
} DBNUMERIC;
Run Code Online (Sandbox Code Playgroud)

当从 MS SQL Server 检索数据时,该结构由 FreeTDS 库填充。我知道从array[1]那里开始是 64 位整数(大端),我想得到它。我使用以下代码:

int64_t result = 0;
result = be64toh(*((decltype(result)*)(numeric.array + 1)));
Run Code Online (Sandbox Code Playgroud)

但是 GCC 给了我警告dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]。但是如果我使用代码:

int64_t result = 0;
decltype(result)* temp_ptr = (decltype(result)*)(numeric.array + 1);
decltype(result) temp = *temp_ptr;
result = be64toh(temp);
Run Code Online (Sandbox Code Playgroud)

没有关于违反严格别名规则的警告。我不认为此代码与原始代码不同,因此我很困惑。如何将数组中的 8 个字节转换为int64_t变量?

c++ gcc strict-aliasing gcc-warning

3
推荐指数
1
解决办法
850
查看次数

使用printf格式说明符生成错误符号的警告

有没有办法让gcc或clang为printf()格式说明符生成带有符号和无符号变量不匹配的警告?

我知道使用-Wformat,但是如果数据类型的大小不正确,则仅报告警告.如果只有标志不正确,它不会生成警告.

例如,即使与签名的unsigned int打印不匹配,以下内容也不会生成警告:

uint32_t x = UINT_MAX;
printf("%d", x);
Run Code Online (Sandbox Code Playgroud)

这将打印出-1.

看起来这将是一个有用的警告,但我没有找到任何方法来启用它.

c gcc-warning

3
推荐指数
1
解决办法
361
查看次数

gcc链接目标文件与警告/优化标志

我们正在使用泛型编译一个软件,其中文件首先被制作成目标文件,它们的构建如下:

arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include  -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flex.o src/flex.c
...
arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include  -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flexdb.o src/flexdb.c
Run Code Online (Sandbox Code Playgroud)

然后他们链接到:

arm-unknown-linux-gnu-gcc -o flex src/flex.o src/flexdb.o src/flexio.o src/flexprotocol.o src/flexsettings.o src/flexstate.o -L/opt/tm-sdk/lib -ltag  -lrt -ltmreader -lsqlite3 -lsha1
Run Code Online (Sandbox Code Playgroud)

我的问题是:我们是否需要在链接期间包含优化和警告标志?如果在从目标文件创建flex二进制文件时包含-Wall,-Wextra和-O2,它会做什么吗?

谢谢

编辑:根据反馈澄清含义.

c gcc gcc-warning compiler-optimization object-files

3
推荐指数
1
解决办法
1159
查看次数

为什么当我不移动任何东西时,clang会抱怨删除的移动?

前提:

#include <iostream>
using namespace std;

class ABC {
 public:

   ABC() {
     cout << "Default constructor ..\n";
   }

   ABC(const ABC& a) {
     cout << "In copy constrcutor ..\n";
   }
   ABC(ABC&& aa) = delete;
};

int main(int argc, char* argv[]) {
  ABC b{ABC{}};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

用GCC vs Clang编译它

Clang - Apple LLVM version 8.1.0 (clang-802.0.42)

Gcc - 5.4.0 ubuntu

观察 Clang抱怨删除了Move构造函数.

Gcc完全不抱怨.并将正确输出.

问题为什么?

对于gcc,我知道如果你只是初始化lvalue和rvalue,它会优化并且实际上不会调用复制构造函数并将临时值复制到左值.

为什么Clang有所不同?我认为(不确定,因此问题)这是在C++标准中,哪一个偏离(或不)?或者我做错了什么.

编译命令:g++ --std=c++11 -O3 file.cpp

为了更多的乐趣,删除花括号,并添加括号;)

ABC b{ABC{}};to,ABC b(ABC());与此问题无关. …

c++ clang gcc-warning move-constructor move-semantics

3
推荐指数
1
解决办法
194
查看次数

如何使关于__FUNCTION__的GCC迂腐(-Wpedantic)警告沉默

当我使用"__FUNCTION__"预定义宏(在gcc和clang中)输入函数时,我打印出(printf)函数的名称.但是,如果我使用-Wpedantic,我会收到此警告:

警告:ISO C不支持'__FUNCTION__'预定义标识符[-Wpedantic]

我如何沉默警告?

c gcc-warning

3
推荐指数
2
解决办法
849
查看次数

从现在开始禁用 GCC 误导性缩进警告?

编译一个相当大的C++ 项目时,我收到以下消息:

注意:-Wmisleading-indentation 从这一点开始被禁用,因为由于代码/标题的大小而禁用了列跟踪

所以,有几个问题:

  • 禁用此警告有多糟糕?
  • 什么样的事情会导致这个被禁用?只是代码太大?
  • 有没有办法优化/修复代码以防止它被禁用?
  • 尽管代码/标头的大小,有没有办法重新启用它?
  • 有没有办法让关于警告被禁用的注释静音?

c++ gcc gcc-warning

3
推荐指数
1
解决办法
3610
查看次数

[[maybe_unused]]在if语句在GCC中似乎不起作用

重点[[maybe_unused]]是它告诉编译器不要警告未使用的变量,对吗?那么,为什么GCC ui在这里警告未使用的东西?

#include <iostream>
#include <vector>

#define NDEBUG
#include <cassert>

int main()
{   
  std::vector<int> numbers = {1,2,3};

  if ([[maybe_unused]] auto  ui = static_cast<unsigned int>(numbers.size()))
  {
    assert(ui);
    std::cout << "ok" << std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?这是编译器中的错误吗?

(顺便说一句:在Wandbox上尝试此操作,ui无论是否[[maybe_unused]]存在Clang,Clang似乎都不会发出警告)。

(此外:ui即使没有,MSVC也不警告未使用[[maybe_unused]])。

c++ gcc gcc-warning c++17

3
推荐指数
1
解决办法
88
查看次数

gcc size_t and sizeof arithmetic conversion to int

I decided to test compile a project with -Wsign-conversion enabled, to see what warnings would come up, and came across something that doesn't seem right, where gcc behaves differently than clang. Can someone please tell me which is correct?

I have a function that takes a size_t param:

void func(size_t) {}
Run Code Online (Sandbox Code Playgroud)

some other struct

struct Test {};
Run Code Online (Sandbox Code Playgroud)

and calling code

int i = some_initialiser();
func(sizeof(Test) + static_cast<size_t>(i));
Run Code Online (Sandbox Code Playgroud)

So from my understanding, sizeof returns size_t, and arithmetic between two variables …

c++ gcc-warning implicit-conversion

3
推荐指数
1
解决办法
103
查看次数