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!");
        }
    }
}
Beispiel #3
0
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);
}