void FeatureCheck::checkArrayArgOrInst(const Function& f) { for (auto const& arg : f.args()) if (arg.getType()->isArrayTy()) issueWarning(arg, "param is an array"); for (auto const& bb : f) for (auto const& inst : bb) if (inst.getType()->isArrayTy()) issueWarning(inst, "inst is an array"); }
void FeatureCheck::checkIndirectLibraryCall(const Function& f) { if (f.isDeclaration()) { for (auto user : f.users()) { ImmutableCallSite cs(user); if (!cs) continue; for (auto i = 0u; i < cs.arg_size(); ++i) if (cs.getArgument(i) == &f) issueWarning(f, "potential indirect external call found!"); } } }
void builtInHash (int numArgs, macroArgument *args, environment *env, outputWriter *ow) { value *theHash; int i; if (!(numArgs == 1 || numArgs % 2 == 0)) { issueError(ERRMAC_WRONG_NUM_ARGS, "hash"); return; } if (numArgs == 1) { if (transformArgumentToScalar(&args[0])->v.scalar.scalar.length > 0) { issueError(ERRMAC_WRONG_NUM_ARGS, "hash"); return; } } theHash = valueNewHash(); for (i = 0; i < numArgs / 2; ++i) { transformArgumentToScalar(&args[i * 2]); if (valueHashLookup(theHash, &args[i * 2].value.value->v.scalar.scalar) != 0) issueWarning(WARNMAC_DUPLICATE_HASH_KEY, args[i * 2].value.value->v.scalar.scalar.data); assureArgumentIsCopy(&args[i * 2 + 1]); valueHashDefine(theHash, &args[i * 2].value.value->v.scalar.scalar, args[i * 2 + 1].value.value); } OUT_VALUE_REF(ow, theHash); }