diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index fd2dc6a1916..0e0b173a4d7 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -373,7 +373,8 @@ def syntax_error_message(exception, unit): return error def recursion_error_message(exception, unit): - l = Location(file=unit.path) + # if unit is a BuiltinModuleExtractable, there will be no path attribute + l = Location(file=unit.path) if hasattr(unit, "path") else None return (DiagnosticMessage(Source("py/diagnostics/recursion-error", "Recursion error in Python extractor"), Severity.ERROR) .with_location(l) .text(exception.args[0]) @@ -383,7 +384,8 @@ def recursion_error_message(exception, unit): ) def internal_error_message(exception, unit): - l = Location(file=unit.path) + # if unit is a BuiltinModuleExtractable, there will be no path attribute + l = Location(file=unit.path) if hasattr(unit, "path") else None return (DiagnosticMessage(Source("py/diagnostics/internal-error", "Internal error in Python extractor"), Severity.ERROR) .with_location(l) .text("Internal error") diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 85868a79351..8e1a371fc71 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ from io import BytesIO #Semantic version of extractor. #Update this if any changes are made -VERSION = "6.1.1" +VERSION = "6.1.2" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 1207caf6727..726c2c90c3b 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -274,16 +274,24 @@ def _extract_loop(proc_id, queue, trap_dir, archive, options, reply_queue, logge # Syntax errors have already been handled in extractor.py reply_queue.put(("FAILURE", unit, None)) except RecursionError as ex: - error = recursion_error_message(ex, unit) - diagnostics_writer.write(error) logger.error("Failed to extract %s: %s", unit, ex) logger.traceback(WARN) + try: + error = recursion_error_message(ex, unit) + diagnostics_writer.write(error) + except Exception as ex: + logger.warning("Failed to write diagnostics: %s", ex) + logger.traceback(WARN) reply_queue.put(("FAILURE", unit, None)) except Exception as ex: - error = internal_error_message(ex, unit) - diagnostics_writer.write(error) logger.error("Failed to extract %s: %s", unit, ex) logger.traceback(WARN) + try: + error = internal_error_message(ex, unit) + diagnostics_writer.write(error) + except Exception as ex: + logger.warning("Failed to write diagnostics: %s", ex) + logger.traceback(WARN) reply_queue.put(("FAILURE", unit, None)) else: reply_queue.put(("SUCCESS", unit, None)) diff --git a/shared/ssa/codeql/ssa/Ssa.qll b/shared/ssa/codeql/ssa/Ssa.qll index 87811b005be..fd785540a37 100644 --- a/shared/ssa/codeql/ssa/Ssa.qll +++ b/shared/ssa/codeql/ssa/Ssa.qll @@ -1322,31 +1322,27 @@ module Make Input> { } } - private module Cached { - cached - newtype TNode = - TParamNode(DfInput::Parameter p) { DfInput::ssaDefInitializesParam(_, p) } or - TExprNode(DfInput::Expr e, Boolean isPost) { - e = DfInput::getARead(_) - or - DfInput::ssaDefAssigns(_, e) and - isPost = false - } or - TSsaDefinitionNode(DefinitionExt def) or - TSsaInputNode(SsaInputDefinitionExt def, BasicBlock input) { - def.hasInputFromBlock(_, _, _, _, input) - } - - cached - Definition getAPhiInputDef(SsaInputNode n) { - exists(SsaInputDefinitionExt phi, BasicBlock bb | - phi.hasInputFromBlock(result, _, _, _, bb) and - n.isInputInto(phi, bb) - ) - } + cached + private DefinitionExt getAPhiInputDef(SsaInputDefinitionExt phi, BasicBlock bb) { + phi.hasInputFromBlock(result, _, _, _, bb) } - private import Cached + private newtype TNode = + TParamNode(DfInput::Parameter p) { + exists(WriteDefinition def | DfInput::ssaDefInitializesParam(def, p)) + } or + TExprNode(DfInput::Expr e, Boolean isPost) { + e = DfInput::getARead(_) + or + exists(DefinitionExt def | + DfInput::ssaDefAssigns(def, e) and + isPost = false + ) + } or + TSsaDefinitionNode(DefinitionExt def) or + TSsaInputNode(SsaInputDefinitionExt phi, BasicBlock input) { + exists(getAPhiInputDef(phi, input)) + } /** * A data flow node that we need to reference in the value step relation. @@ -1627,6 +1623,14 @@ module Make Input> { */ signature predicate guardChecksSig(DfInput::Guard g, DfInput::Expr e, boolean branch); + pragma[nomagic] + private Definition getAPhiInputDef(SsaInputNode n) { + exists(SsaInputDefinitionExt phi, BasicBlock bb | + result = getAPhiInputDef(phi, bb) and + n.isInputInto(phi, bb) + ) + } + /** * Provides a set of barrier nodes for a guard that validates an expression. *