我经常听到,在编译C和C ++程序时,我应该“始终启用编译器警告”。为什么这是必要的?我怎么做?
有时我也听说我应该“将警告视为错误”。我是不是该?我怎么做?
自从新的ADT预览版本(版本21)以来,它们有一个新的lint警告,它告诉我清单文件(在应用程序标记中)的下一件事:
应该明确地将android:allowBackup设置为true或false(默认情况下为true,这可能会对应用程序的数据产生一些安全隐患)
在官方网站上,他们写道:
一些新检查:您必须明确决定您的应用是否允许备份和标签检查.有一个新的命令行标志用于设置库路径.编辑时增量lint分析的许多改进.
这警告是什么?什么是备份功能,以及如何使用它?
另外,为什么警告告诉我它有安全隐患?禁用此功能有哪些缺点和优点?
清单有两种备份概念:
是否允许应用程序参与备份和还原基础结构.如果此属性设置为false,则不会执行应用程序的备份或还原,即使是全系统备份也会导致所有应用程序数据都通过adb保存.此属性的默认值为true.
这被认为是一个安全问题,因为人们可以通过ADB备份您的应用,然后将您应用的私人数据导入他们的PC.
但是,我认为这不是一个问题,因为大多数用户不知道什么是adb,如果他们这样做,他们也会知道如何根设备.ADB功能仅在设备启用了调试功能时才有效,这需要用户启用它.
因此,只有将其设备连接到PC并启用调试功能的用户才会受到影响.如果他们的PC上有使用ADB工具的恶意应用程序,这可能会有问题,因为应用程序可以读取私有存储数据.
我认为Google应该在开发人员类别中添加默认禁用的功能,以允许通过ADB备份和恢复应用.
实现应用程序备份代理的类的名称,BackupAgent的子类.属性值应该是完全限定的类名(例如"com.example.project.MyBackupAgent").但是,作为简写,如果名称的第一个字符是句点(例如,".MyBackupAgent"),则它将附加到元素中指定的包名称.没有默认值.必须指定名称.
这不是安全问题.
android adt compiler-warnings android-lint android-backup-service
@SuppressWarningsJava 中有效警告名称的列表是什么?
进来之间的("")位@SuppressWarnings("").
在Visual C++中,可以使用#pragma warning (disable: ...).我还发现在GCC中你可以覆盖每个文件的编译器标志.我怎样才能为"下一行"做这个,或者使用GCC围绕代码区域推送/弹出语义?
我正在进行一些练习,并得到一个警告:
隐式转换失去整数精度'NSUInteger'(又名'unsigned long')到'int'
我很喜欢这个菜鸟,非常感谢任何帮助..谢谢.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSArray *myColors;
int i;
int count;
myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
count = myColors.count; // <<< issue warning here
for (i = 0; i < count; i++)
NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

有了这个简单的类,我得到编译器警告
试图
x在自己的setter/getter中修改/访问
当我像这样使用它时:
var p: point = Point()
p.x = 12
Run Code Online (Sandbox Code Playgroud)
我得到一个EXC_BAD_ACCESS.如果没有明确支持ivars,我怎么能这样做?
class Point {
var x: Int {
set {
x = newValue * 2 //Error
}
get {
return x / 2 //Error
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud) struct SemanticDirection;
fn main() {}
Run Code Online (Sandbox Code Playgroud)
warning: struct is never used: `SemanticDirection`
--> src/main.rs:1:1
|
1 | struct SemanticDirection;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(dead_code)] on by default
Run Code Online (Sandbox Code Playgroud)
我会将这些警告重新发送给任何严肃的事情,但我只是在修补这种语言而这正在驱使我蝙蝠.
我尝试添加#[allow(dead_code)]到我的代码,但这不起作用.
我想启用 - 字面上 - GCC 所有的警告.(你会觉得这很容易......)
你认为-Wall可能会有所作为,但不是!仍然需要-Wextra.
你认为-Wextra可能会有所作为,但不是!并非此处列出的所有警告(例如-Wshadow)都已启用.我仍然不知道这份清单是否全面.
我如何告诉海湾合作委员会启用(不是,不是,或者是!)所有警告?
在阅读有关未定义行为和序列点的答案后,我写了一个小程序:
#include <stdio.h>
int main(void) {
int i = 5;
i = (i, ++i, 1) + 1;
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是2.天啊,我没有看到减量来了!这里发生了什么?
另外,在编译上面的代码时,我收到一条警告:
px.c:5:8:警告:逗号表达式的左侧操作数无效
Run Code Online (Sandbox Code Playgroud)[-Wunused-value] i = (i, ++i, 1) + 1; ^
为什么?但可能会通过我的第一个问题的答案自动回答.
c ×4
warnings ×4
c++ ×2
gcc ×2
adt ×1
android ×1
android-lint ×1
c++-faq ×1
dead-code ×1
eclipse ×1
expression ×1
gcc-warning ×1
java ×1
objective-c ×1
operators ×1
pragma ×1
properties ×1
rust ×1
swift ×1