如果我不处理if语句的其他条件,我想让编译器警告我.这是否存在于clang或gcc中?
为了澄清,我并不是想让我的所有源代码都开启.但是,有时整个文件或大量的代码,我根本无法承受不考虑每一个其他块的设计.因此,我想,我真的在寻找一个pragma,我可以打开和关闭以启用和禁用几千行非常重要的代码.
想象它是一个自动代码审查或静态分析工具.
要说编译器不能这样做,因为它是合法的......在实践中不是问题.我见过的每个C/C++编译器都会很乐意发出大量警告,以防止在语法和语义上完全有效的代码.(例如在gcc中,-Wunused-value,-Wunused-label,-Wunreachable-code等...)
我正在为Windows,Mac OS X和Linux开发跨平台C ++应用程序。开发在Windows上完成,然后测试了与Mac OS X和Linux上的gcc的兼容性。在Windows上,我们使用Visual Studio进行编译;在Linux和Mac OS X上,我们使用Makefile。
有没有一种方法可以过滤每个项目/模块的编译器警告?大多数项目都有自己的Makefile,然后为子项目调用qmake。在这种情况下,他们是收集编译器警告和错误的工具还是证明方法?理想情况下,我希望有html输出,每个项目都有一个摘要,而实际错误则有一个详细页面。
我已经阅读了许多有关此警告的问题(取消引用类型双关指针会破坏严格别名规则,取消引用类型双关指针会破坏严格别名规则 [-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变量?
有没有办法让gcc或clang为printf()格式说明符生成带有符号和无符号变量不匹配的警告?
我知道使用-Wformat,但是如果数据类型的大小不正确,则仅报告警告.如果只有标志不正确,它不会生成警告.
例如,即使与签名的unsigned int打印不匹配,以下内容也不会生成警告:
uint32_t x = UINT_MAX;
printf("%d", x);
Run Code Online (Sandbox Code Playgroud)
这将打印出-1.
看起来这将是一个有用的警告,但我没有找到任何方法来启用它.
我们正在使用泛型编译一个软件,其中文件首先被制作成目标文件,它们的构建如下:
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,它会做什么吗?
谢谢
编辑:根据反馈澄清含义.
前提:
#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());与此问题无关. …
当我使用"__FUNCTION__"预定义宏(在gcc和clang中)输入函数时,我打印出(printf)函数的名称.但是,如果我使用-Wpedantic,我会收到此警告:
警告:ISO C不支持'__FUNCTION__'预定义标识符[-Wpedantic]
我如何沉默警告?
编译一个相当大的C++ 项目时,我收到以下消息:
注意:-Wmisleading-indentation 从这一点开始被禁用,因为由于代码/标题的大小而禁用了列跟踪
所以,有几个问题:
重点[[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]])。
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 …