I've been playing around with Dehydra a bit, and wanted to make it
warn whenever a copy constructor is used for a function call argument.
So I have C++ code like:
struct t {
t(const char* v);
t(const t& v);
const char* data;
};
t f(t v);
t g(const t& v);
int main() {
t a("test");
f(a);
g(f(a));
a = f(a);
}
and want it to complain about all those f(a) calls. So I have a script
like:
function find_ctor_calls(loc, v) {
if (v.isFcall) {
warning("# Fcall '" + v.name + "' with " +
v.arguments.length + " args", loc);
for each (var arg in v.arguments) {
if (arg.isConstructor)
warning("Constructor '" + arg.name + "' used in
argument to '" + v.name + "'", loc);
find_ctor_calls(loc, arg);
}
}
if (v.assign) {
for each (var v2 in v.assign)
find_ctor_calls(loc, v2);
}
}
function process_function(decl, body) {
for each (var stmts in body)
for each (var stmt in stmts.statements)
find_ctor_calls(stmts.loc, stmt);
}
which outputs (using dehydra-gcc 5435efc32dad):
test.cpp:11: warning: # Fcall 't::t(const char*)' with 1 args
test.cpp:13: warning: # Fcall 'f(t)' with 1 args
test.cpp:13: warning: Constructor 't::t(const t&)' used in
argument to 'f(t)'
test.cpp:13: warning: # Fcall 't::t(const t&)' with 1 args
test.cpp:15: warning: # Fcall 'g(const t&)' with 1 args
test.cpp:15: warning: # Fcall 'f(t)' with 0 args
test.cpp:17: warning: # Fcall 'f(t)' with 0 args
It only finds the first f(a), because in the last two cases Dehydra
appears to skip the arguments to f (according to the "Fcall f(t) with
0 args" lines). Is that a bug in Dehydra, or a feature, or am I just
using it wrong?
_______________________________________________
Dev-static-analysis mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-static-analysis