考虑一个大型项目,其中许多类型为typedef
'd,例如
typedef int age;
typedef int height;
和一些函数获取这些类型的参数:
void printPerson(age a, height h) {
printf("Age %d, Height %d\n", a, h);
}
如果这些参数的类型错误,有没有办法在编译时发出警告,例如
age a = 30;
height h = 180;
printPerson(h, a); /* No warning, because a and h are both integers */
在这种情况下,gcc(或某些静态代码分析工具)是否有选项可以发出警告?
答案 0 :(得分:6)
GCC中没有内置支持。
根据Sparse nocast
属性添加a feature request。但是,这还没有实施。但是,如果您可以使用Sparse,则可以通过使用__attribute__((nocast))
标记每个typedef来执行此操作。
在C ++中,您可以通过创建包装类而不是typedef来完成此操作,然后只是不为它们定义隐式转换。
答案 1 :(得分:2)
Klocwork有一些与他们称之为“强类型”相关的检查。
对于您的代码,它会抛出STRONG.TYPE.ASSIGN.ARG,因为参数类型不匹配。
它还抱怨将int
值(对象)分配给age
和height
类型变量,以及将变量用作int
中的printf
。
我听说它很贵。
答案 2 :(得分:2)
正如其他回复所表明的那样,你不会从gcc免费获得这个。你肯定是进入静态分析工具的世界来解决这个问题。
对此有一些建议,其中一些需要额外的注释,其中一些不是,但可能比你正在寻找的更多。因此,我认为我还要再投入一个......
对我来说,长期以来一直是各种命令行lint工具。在您的情况下,我认为PC-lint / flexelint非常适合即使它是一个商业工具。请参阅here进行强类型检查。
答案 3 :(得分:0)
不,不可能。如果您正在做(或即将做)非法的事情,编译器会发出警告。它不应该知道(或确定)将作为函数参数传递的值的正确性。只要类型相同,就没有任何理由抱怨。
但是,如果类型不匹配,它会提醒您。
答案 4 :(得分:0)
仅在类型不同时才会生成错误。你可以将这些类型包装在struct中,并使用宏来自动定义和赋值。
如果您愿意使用枚举而不是整数,则可以选择在名为coverity的静态代码分析工具中使用混合枚举时发出警告。
https://wiki.ubuntu.com/CoverityCheckerDictionary 寻找MIXED_ENUMS。
答案 5 :(得分:0)
正如其他人已经说过的那样,在C中没有对此的支持。如果你绝对想要进行强类型检查,你可以这样做:
function main() {
canvas = new fabric.Canvas('imageCanvas');
// loading image on canvas
document.getElementById('uploadedImg').onchange = function handleImage(e) {
var reader = new FileReader();
reader.onload = function (event) {
var imgObj = new Image();
imgObj.src = event.target.result;
imgObj.onload = function () {
// start fabricJS stuff
image = new fabric.Image(imgObj);
image.set({
centeredRotation: true,
centeredScaling: true,
});
canvas.add(image);
};
};
reader.readAsDataURL(e.target.files[0]);
};
}
请注意,这可能会对性能产生一些影响。