Search in sources :

Example 1 with Context

use of com.cflint.plugins.Context in project CFLint by cflint.

the class CFLint method fireStartedProcessing.

protected void fireStartedProcessing(final String srcidentifier) {
    cfmlParser = new CFMLParser();
    cfmlParser.setErrorReporter(this);
    currentFile = srcidentifier;
    currentElement = null;
    for (final CFLintStructureListener structurePlugin : getStructureListeners(extensions)) {
        try {
            structurePlugin.startFile(srcidentifier, bugs);
        } catch (final Exception e) {
            printException(e);
            final Context context = new Context(currentFile, currentElement, null, true, null, null);
            final ContextMessage cm = new ContextMessage(PARSE_ERROR, null, null, context.startLine());
            reportRule(currentElement, null, context, null, cm);
        }
    }
    for (final ScanProgressListener p : scanProgressListeners) {
        p.startedProcessing(srcidentifier);
    }
}
Also used : Context(com.cflint.plugins.Context) CFMLParser(cfml.parsing.CFMLParser) ContextMessage(com.cflint.plugins.Context.ContextMessage) ScanProgressListener(com.cflint.listeners.ScanProgressListener) CFLintStructureListener(com.cflint.plugins.CFLintStructureListener) ParseException(cfml.parsing.reporting.ParseException) IOException(java.io.IOException) CFLintScanException(com.cflint.exception.CFLintScanException)

Example 2 with Context

use of com.cflint.plugins.Context in project CFLint by cflint.

the class CFLint method process.

private void process(final CFScriptStatement expression, final Context context) {
    if (expression == null) {
        return;
    }
    if (expression != null && expression.getToken() != null) {
        final List<Object> checkItem = Arrays.asList(expression, expression.getToken());
        if (processed.contains(checkItem)) {
            if (!quiet) {
                System.err.println("Attempt to process expression twice aborted.  This may be a parsing bug in " + context.getFilename() + " : " + (expression.getToken() != null ? expression.getToken().getLine() : ""));
            }
            return;
        }
        processed.add(checkItem);
    }
    final Element elem = context.getElement();
    try {
        if (expression instanceof CFCompoundStatement) {
            scanExpression(expression, context, elem);
            for (final CFScriptStatement statement : ((CFCompoundStatement) expression).getStatements()) {
                process(statement, context);
            }
        } else if (expression instanceof CFExpressionStatement) {
            scanExpression(expression, context, elem);
            registerRuleOverrides(context, (CFExpressionStatement) expression);
            process(((CFExpressionStatement) expression).getExpression(), elem, context);
        } else if (expression instanceof CFPropertyStatement) {
            try {
                final CFPropertyStatement propertyStatement = (CFPropertyStatement) expression;
                CFExpression value = propertyStatement.getPropertyName();
                if (value == null) {
                    for (final Entry<CFIdentifier, CFExpression> entry : propertyStatement.getAttributes().entrySet()) {
                        if (CF.NAME.equalsIgnoreCase(entry.getKey().getName())) {
                            value = entry.getValue();
                        }
                    }
                }
                if (value != null) {
                    final String name = value.Decompile(0);
                    handler.addVariable(name.substring(1, name.length() - 1));
                }
            } catch (final Exception e) {
                e.printStackTrace();
            }
            scanExpression(expression, context, elem);
        } else if (expression instanceof CFCompDeclStatement) {
            final CFCompDeclStatement compDeclStatement = (CFCompDeclStatement) expression;
            final Context componentContext = context.subContext(null);
            componentContext.setInComponent(true);
            componentContext.setContextType(ContextType.COMPONENT);
            for (final Entry<CFExpression, CFExpression> entry : compDeclStatement.getAttributes().entrySet()) {
                if (entry.getKey() != null && entry.getKey().Decompile(0).equalsIgnoreCase(CF.NAME)) {
                    componentContext.setComponentName(entry.getValue().Decompile(0));
                }
            }
            // Register any overrides from multi-line comments.
            registerRuleOverrides(componentContext, expression.getToken());
            // do startComponent notifications
            doStructureStart(elem, componentContext, expression.getClass());
            scanExpression(compDeclStatement, componentContext, elem);
            // process the component declaration
            if (compDeclStatement.getBody() instanceof CFCompoundStatement) {
                // Process property expressions first
                for (final CFScriptStatement subscript : compDeclStatement.getBody().decomposeScript()) {
                    if (subscript instanceof CFPropertyStatement) {
                        process(subscript, componentContext);
                    }
                }
                for (final CFScriptStatement subscript : compDeclStatement.getBody().decomposeScript()) {
                    if (!(subscript instanceof CFPropertyStatement)) {
                        process(subscript, componentContext);
                    }
                }
            } else {
                process(compDeclStatement.getBody(), componentContext);
            }
            // do endComponent notifications
            for (final CFLintStructureListener structurePlugin : getStructureListeners(extensions)) {
                try {
                    structurePlugin.endComponent(componentContext, bugs);
                    for (final ContextMessage message : componentContext.getMessages()) {
                        reportRule(elem, null, componentContext, (CFLintScanner) structurePlugin, message);
                    }
                    componentContext.getMessages().clear();
                } catch (final Exception e) {
                    printException(e);
                    final ContextMessage cm = new ContextMessage(PARSE_ERROR, null, null, context.startLine());
                    reportRule(currentElement, null, context, null, cm);
                }
            }
        } else if (expression instanceof CFForStatement) {
            scanExpression(expression, context, elem);
            process(((CFForStatement) expression).getInit(), elem, context);
            process(((CFForStatement) expression).getCond(), elem, context);
            process(((CFForStatement) expression).getNext(), elem, context);
            process(((CFForStatement) expression).getBody(), context);
        } else if (expression instanceof CFWhileStatement) {
            scanExpression(expression, context, elem);
            process(((CFWhileStatement) expression).getCond(), elem, context);
            process(((CFWhileStatement) expression).getBody(), context);
        } else if (expression instanceof CFForInStatement) {
            scanExpression(expression, context, elem);
            final Context forInitContext = context.subContext(elem);
            forInitContext.setInAssignmentExpression(true);
            process(((CFForInStatement) expression).getVariable(), elem, forInitContext);
            process(((CFForInStatement) expression).getStructure(), elem, context);
            process(((CFForInStatement) expression).getBody(), context);
        } else if (expression instanceof CFIfStatement) {
            scanExpression(expression, context, elem);
            final CFIfStatement cfif = (CFIfStatement) expression;
            process(cfif.getCond(), elem, context);
            process(cfif.getThenStatement(), context);
            process(cfif.getElseStatement(), context);
        } else if (expression instanceof CFSwitchStatement) {
            scanExpression(expression, context, elem);
            final CFSwitchStatement cfswitch = (CFSwitchStatement) expression;
            process(cfswitch.getVariable(), elem, context);
            for (final CFCase _case : cfswitch.getCases()) {
                process(_case, context);
            }
        } else if (expression instanceof CFCase) {
            scanExpression(expression, context, elem);
            final CFCase cfcase = (CFCase) expression;
            for (final CFScriptStatement cfstatement : cfcase.getStatements()) {
                process(cfstatement, context);
            }
        } else if (expression instanceof CFTryCatchStatement) {
            scanExpression(expression, context, elem);
            final CFTryCatchStatement cftry = (CFTryCatchStatement) expression;
            process(cftry.getBody(), context);
            for (final CFCatchStatement stmt : cftry.getCatchStatements()) {
                handler.push(CF.CFCATCH);
                if (stmt.getVariable() != null && stmt.getVariable().getName() != null) {
                    handler.addVariable(stmt.getVariable().getName());
                }
                process(stmt.getCatchBody(), context);
                handler.pop();
            }
            process(cftry.getFinallyStatement(), context);
        } else if (expression instanceof CFReturnStatement) {
            scanExpression(expression, context, elem);
            final CFReturnStatement cfreturn = (CFReturnStatement) expression;
            final CFExpression subExpression = cfreturn.getExpression();
            process(subExpression, elem, context);
        } else if (expression instanceof CFFuncDeclStatement) {
            final CFFuncDeclStatement function = (CFFuncDeclStatement) expression;
            final Context functionContext = context.subContext(null);
            functionContext.setContextType(ContextType.FUNCTION);
            functionContext.setFunctionInfo(function);
            registerRuleOverrides(functionContext, function.getToken());
            handler.push(CF.FUNCTION);
            for (final CFFunctionParameter param : function.getFormals()) {
                handler.addArgument(param.getName());
            }
            doStructureStart(elem, functionContext, CFFuncDeclStatement.class);
            scanExpression(expression, functionContext, elem);
            final Context functionBodyContext = functionContext.subContext(null);
            process(function.getBody(), functionBodyContext);
            for (final CFLintStructureListener structurePlugin : getStructureListeners(extensions)) {
                try {
                    structurePlugin.endFunction(functionContext, bugs);
                    for (final ContextMessage message : functionContext.getMessages()) {
                        reportRule(elem, null, functionContext, (CFLintScanner) structurePlugin, message);
                    }
                    functionContext.getMessages().clear();
                } catch (final Exception e) {
                    printException(e);
                    final ContextMessage cm = new ContextMessage(PARSE_ERROR, null, null, context.startLine());
                    reportRule(currentElement, null, context, null, cm);
                }
            }
            handler.pop();
        } else if (expression instanceof CFIncludeStatement) {
            scanExpression(expression, context, elem);
            final CFExpression includeExpr = ((CFIncludeStatement) expression).getTemplate();
            if (includeExpr instanceof CFStringExpression) {
                final List<CFExpression> subExpressions = ((CFStringExpression) includeExpr).getSubExpressions();
                if (subExpressions.size() == 1 && subExpressions.get(0) instanceof CFLiteral) {
                    final String path = ((CFLiteral) subExpressions.get(0)).getVal();
                    final File include = new File(new File(context.getFilename()).getParentFile(), path);
                    if (include.exists() || strictInclude) {
                        try {
                            if (includeFileStack.contains(include)) {
                                if (!quiet) {
                                    System.err.println("Terminated a recursive call to include file " + include);
                                }
                            } else {
                                includeFileStack.push(include);
                                process(FileUtil.loadFile(include), context.getFilename());
                                includeFileStack.pop();
                            }
                        } catch (final CFLintScanException ex) {
                            if (!quiet) {
                                System.err.println("Invalid include file " + context.getFilename());
                            }
                            final int line = context.startLine();
                            final ContextMessage cm = new ContextMessage(PARSE_ERROR, null, null, line);
                            reportRule(currentElement, "Invalid include file " + expression.getClass(), context, null, cm);
                        }
                    }
                } else if (strictInclude) {
                    if (!quiet) {
                        System.err.println("Unable to resolve template value " + context.getFilename());
                    }
                    final int line = context.startLine();
                    final ContextMessage cm = new ContextMessage(PARSE_ERROR, null, null, line);
                    reportRule(currentElement, "Unable to resolve template value " + expression.getClass(), context, null, cm);
                }
            }
        } else {
            scanExpression(expression, context, elem);
            for (CFScriptStatement childExpression : expression.decomposeScript()) {
                process(childExpression, context);
            }
        }
    } catch (final StackOverflowError soe) {
        if (!quiet) {
            System.err.println("Stack overflow in " + context.getFilename());
        }
        final int line = context.startLine();
        final ContextMessage cm = new ContextMessage(PARSE_ERROR, null, null, line);
        reportRule(currentElement, "Stack overflow on " + expression.getClass(), context, null, cm);
    }
    // Process any messages added by downstream parsing.
    for (final ContextMessage message : context.getMessages()) {
        reportRule(elem, null, context, message.getSource(), message);
    }
    context.getMessages().clear();
}
Also used : CFWhileStatement(cfml.parsing.cfscript.script.CFWhileStatement) CFFuncDeclStatement(cfml.parsing.cfscript.script.CFFuncDeclStatement) CFReturnStatement(cfml.parsing.cfscript.script.CFReturnStatement) CFLintScanException(com.cflint.exception.CFLintScanException) Element(net.htmlparser.jericho.Element) CFFunctionParameter(cfml.parsing.cfscript.script.CFFunctionParameter) CFPropertyStatement(cfml.parsing.cfscript.script.CFPropertyStatement) CFIdentifier(cfml.parsing.cfscript.CFIdentifier) CFExpression(cfml.parsing.cfscript.CFExpression) CFForStatement(cfml.parsing.cfscript.script.CFForStatement) Entry(java.util.Map.Entry) CFLiteral(cfml.parsing.cfscript.CFLiteral) List(java.util.List) ArrayList(java.util.ArrayList) CFIncludeStatement(cfml.parsing.cfscript.script.CFIncludeStatement) Context(com.cflint.plugins.Context) CFCompoundStatement(cfml.parsing.cfscript.script.CFCompoundStatement) CFLintScanner(com.cflint.plugins.CFLintScanner) CFCompDeclStatement(cfml.parsing.cfscript.script.CFCompDeclStatement) ParseException(cfml.parsing.reporting.ParseException) IOException(java.io.IOException) CFLintScanException(com.cflint.exception.CFLintScanException) CFIfStatement(cfml.parsing.cfscript.script.CFIfStatement) CFTryCatchStatement(cfml.parsing.cfscript.script.CFTryCatchStatement) CFForInStatement(cfml.parsing.cfscript.script.CFForInStatement) ContextMessage(com.cflint.plugins.Context.ContextMessage) CFStringExpression(cfml.parsing.cfscript.CFStringExpression) CFScriptStatement(cfml.parsing.cfscript.script.CFScriptStatement) CFSwitchStatement(cfml.parsing.cfscript.script.CFSwitchStatement) CFCatchStatement(cfml.parsing.cfscript.script.CFCatchStatement) CFCase(cfml.parsing.cfscript.script.CFCase) CFExpressionStatement(cfml.parsing.cfscript.script.CFExpressionStatement) File(java.io.File) CFLintStructureListener(com.cflint.plugins.CFLintStructureListener)

Example 3 with Context

use of com.cflint.plugins.Context in project CFLint by cflint.

the class CFLint method process.

/**
 * @param expression
 *            CF expression
 * @param elem
 *            Jericho HTML element
 * @param oldcontext
 *            The previous context
 */
private void process(final CFExpression expression, final Element elem, final Context oldcontext) {
    if (expression != null) {
        final Context context = oldcontext.subContext(elem);
        for (final CFLintScanner plugin : extensions) {
            try {
                plugin.expression(expression, context, bugs);
                for (final ContextMessage message : context.getMessages()) {
                    reportRule(elem, expression, context, plugin, message);
                }
                context.getMessages().clear();
            } catch (final Exception e) {
                printException(e);
                reportRule(elem, expression, context, plugin, PLUGIN_ERROR);
            }
        }
        // Handle a few expression types in a special fashion.
        if (expression instanceof CFVarDeclExpression) {
            handler.addVariable(((CFVarDeclExpression) expression).getName());
        }
        // CFIdentifier should not decompose
        if (expression.getClass().equals(CFIdentifier.class)) {
            final String name = ((CFIdentifier) expression).getName();
            handler.checkVariable(name);
        }
        if (expression instanceof CFStructElementExpression) {
            final Context assignmentContext = context.subContext(elem);
            assignmentContext.setInStructKeyExpression(true);
            handler.push(CF.STRUCT);
            process(((CFStructElementExpression) expression).getKey(), elem, assignmentContext);
            handler.pop();
            process(((CFStructElementExpression) expression).getValue(), elem, context);
        } else if (expression instanceof CFVarDeclExpression) {
            final Context assignmentContext = context.subContext(elem);
            assignmentContext.setInAssignmentExpression(true);
            process(((CFVarDeclExpression) expression).getVar(), elem, assignmentContext);
            // Right hand side is handled below. Left hand side gets a
            // special context.
            process(((CFVarDeclExpression) expression).getInit(), elem, context);
        // Only process function call expressions
        } else if (expression instanceof CFAssignmentExpression && !(expression instanceof CFTernaryExpression)) {
            final Context assignmentContext = context.subContext(elem);
            assignmentContext.setInAssignmentExpression(true);
            process(((CFAssignmentExpression) expression).getLeft(), elem, assignmentContext);
            // Right hand side is handled below. Left hand side gets a
            // special context.
            process(((CFAssignmentExpression) expression).getRight(), elem, context);
        // Only process function call expressions
        } else if (expression instanceof CFFullVarExpression) {
            final CFFullVarExpression fullVarExpression = (CFFullVarExpression) expression;
            if (context.isInAssignmentExpression() && new CFScopes().isScoped(fullVarExpression, "local") && fullVarExpression.getExpressions().size() > 1) {
                handler.addVariable(fullVarExpression.getExpressions().get(1).Decompile(0));
            }
            final Context subContext = context.subContext(context.getElement());
            subContext.setInAssignmentExpression(false);
            for (final CFExpression expr : fullVarExpression.getExpressions()) {
                if (expr instanceof CFFunctionExpression) {
                    process(expr, elem, subContext);
                } else if (expr instanceof CFMember) {
                    process(((CFMember) expr).getExpression(), elem, subContext);
                } else if (expr instanceof CFArrayExpression) {
                    final CFArrayExpression aryExpr = (CFArrayExpression) expr;
                    if (!aryExpr.getElements().isEmpty()) {
                        process(aryExpr.getElements().get(0), elem, subContext);
                    }
                }
            }
        } else if (expression instanceof CFFunctionExpression && tagInfo.isTag(((CFFunctionExpression) expression).getFunctionName())) {
            final CFFunctionExpression functionExpr = (CFFunctionExpression) expression;
            final StringBuilder sb = new StringBuilder();
            sb.append("<").append(functionExpr.getFunctionName()).append(" ");
            for (final CFExpression expr : functionExpr.getArgs()) {
                if (expr instanceof CFAssignmentExpression) {
                    final CFAssignmentExpression assignExpr = (CFAssignmentExpression) expr;
                    sb.append(assignExpr.getLeft().Decompile(0)).append("=").append(assignExpr.getRight().Decompile(0)).append(" ");
                }
            }
            sb.append("/>");
            final CFMLSource source = new CFMLSource(sb.toString());
            try {
                processStack(source.getChildElements(), " ", context.subContextCFML(source.getChildElements().size() > 0 ? source.getChildElements().get(0) : null, expression));
            } catch (CFLintScanException e) {
            }
            if (functionExpr.getBody() != null) {
                process(functionExpr.getBody(), context);
            }
        } else if (!(expression instanceof CFNewExpression)) {
            // EXCEPT CFNewExpressions.
            for (final CFExpression child : expression.decomposeExpression()) {
                process(child, elem, context.subContextInAssignment(false));
            }
        } else {
            // Process only the right hand side of new expressions
            final CFNewExpression newExpr = (CFNewExpression) expression;
            for (final CFExpression child : (List<CFExpression>) newExpr.getArgs()) {
                if (child instanceof CFAssignmentExpression) {
                    process(((CFAssignmentExpression) child).getRight(), elem, context.subContextInAssignment(false));
                }
            }
        }
    }
}
Also used : Context(com.cflint.plugins.Context) CFStructElementExpression(cfml.parsing.cfscript.CFStructElementExpression) CFMLSource(cfml.parsing.CFMLSource) CFNewExpression(cfml.parsing.cfscript.CFNewExpression) CFFunctionExpression(cfml.parsing.cfscript.CFFunctionExpression) CFLintScanException(com.cflint.exception.CFLintScanException) CFLintScanner(com.cflint.plugins.CFLintScanner) CFAssignmentExpression(cfml.parsing.cfscript.CFAssignmentExpression) CFIdentifier(cfml.parsing.cfscript.CFIdentifier) ParseException(cfml.parsing.reporting.ParseException) IOException(java.io.IOException) CFLintScanException(com.cflint.exception.CFLintScanException) CFScopes(com.cflint.plugins.core.CFScopes) CFArrayExpression(cfml.parsing.cfscript.CFArrayExpression) CFExpression(cfml.parsing.cfscript.CFExpression) ContextMessage(com.cflint.plugins.Context.ContextMessage) CFMember(cfml.parsing.cfscript.CFMember) CFVarDeclExpression(cfml.parsing.cfscript.CFVarDeclExpression) CFTernaryExpression(cfml.parsing.cfscript.CFTernaryExpression) CFFullVarExpression(cfml.parsing.cfscript.CFFullVarExpression)

Example 4 with Context

use of com.cflint.plugins.Context in project CFLint by cflint.

the class CFLint method processStack.

public void processStack(final List<Element> elements, final String space, final String filename, final CFIdentifier functionName) throws IOException, ParseException, CFLintScanException {
    Element commentElement = null;
    for (final Element elem : elements) {
        if (elem.getName().equals(CF.COMMENT)) {
            commentElement = elem;
        } else {
            final Context context = new Context(filename, elem, functionName, false, handler, configuration);
            if (commentElement != null) {
                applyRuleOverrides(context, commentElement);
                commentElement = null;
            }
            process(elem, space, context);
        }
    }
}
Also used : Context(com.cflint.plugins.Context) Element(net.htmlparser.jericho.Element)

Example 5 with Context

use of com.cflint.plugins.Context in project CFLint by cflint.

the class VariableNameChecker method checkNameForBugs.

public void checkNameForBugs(final Context context, final String fullVariable, final String variable, final String filename, final String functionName, final int line, final int offset, final BugList bugs, final CFExpression cfExpression) {
    if (excludeFromAnalyse(context, variable)) {
        return;
    }
    final CFScopes scope = new CFScopes();
    final String varScope = scope.getScope(fullVariable);
    final ValidName name = new ValidName(minVarLength, maxVarLength, maxVarWords);
    try {
        parseParameters(name, context.getConfiguration());
    } catch (ConfigError configError) {
    // Carry on with defaults
    }
    Context parent = context.getParent(ContextType.FUNCTION);
    if (name.isInvalid(scope.descope(variable), context.getConfiguration().getParameter(this, "case"))) {
        parent.addUniqueMessage("VAR_INVALID_NAME", variable, this, line, offset, cfExpression);
    }
    if (!scope.isCFScoped(variable) && name.isUpperCase(variable) && !context.getConfiguration().getParameterNotNull(this, "ignoreAllCapsInScopes").toLowerCase().contains(varScope)) {
        parent.addUniqueMessage("VAR_ALLCAPS_NAME", variable, this, line, offset, cfExpression);
    }
    if (scope.isCFScoped(variable) && name.isUpperCase(variable) && !context.getConfiguration().getParameterNotNull(this, "ignoreUpperCaseScopes").contains(variable)) {
        parent.addUniqueMessage("SCOPE_ALLCAPS_NAME", variable, this, line, offset, cfExpression);
    }
    if (name.tooShort(variable)) {
        parent.addUniqueMessage("VAR_TOO_SHORT", variable, this, line, offset, cfExpression);
    }
    if (name.tooLong(variable)) {
        parent.addUniqueMessage("VAR_TOO_LONG", variable, this, line, offset, cfExpression);
    }
    if (!name.isUpperCase(variable) && name.tooWordy(variable)) {
        parent.addUniqueMessage("VAR_TOO_WORDY", variable, this, line, offset, cfExpression);
    }
    if (name.isTemporary(variable)) {
        parent.addUniqueMessage("VAR_IS_TEMPORARY", variable, this, line, offset, cfExpression);
    }
    if (name.hasPrefixOrPostfix(variable) && !context.getConfiguration().getParameterNotNull(this, "ignorePrefixPostfixOn").contains(variable)) {
        parent.addUniqueMessage("VAR_HAS_PREFIX_OR_POSTFIX", variable, this, line, offset, cfExpression);
    }
}
Also used : Context(com.cflint.plugins.Context)

Aggregations

Context (com.cflint.plugins.Context)10 ContextMessage (com.cflint.plugins.Context.ContextMessage)6 ParseException (cfml.parsing.reporting.ParseException)5 CFLintScanException (com.cflint.exception.CFLintScanException)5 IOException (java.io.IOException)5 CFExpression (cfml.parsing.cfscript.CFExpression)4 CFScriptStatement (cfml.parsing.cfscript.script.CFScriptStatement)4 CFLintScanner (com.cflint.plugins.CFLintScanner)4 Element (net.htmlparser.jericho.Element)4 CFLintStructureListener (com.cflint.plugins.CFLintStructureListener)3 ArrayList (java.util.ArrayList)3 CFMLParser (cfml.parsing.CFMLParser)2 CFMLSource (cfml.parsing.CFMLSource)2 CFIdentifier (cfml.parsing.cfscript.CFIdentifier)2 CFFuncDeclStatement (cfml.parsing.cfscript.script.CFFuncDeclStatement)2 Token (org.antlr.v4.runtime.Token)2 CFSCRIPTParser (cfml.CFSCRIPTParser)1 ParserTag (cfml.parsing.ParserTag)1 CFArrayExpression (cfml.parsing.cfscript.CFArrayExpression)1 CFAssignmentExpression (cfml.parsing.cfscript.CFAssignmentExpression)1