From 8a69a9ae07f94648be1a1b1cb085c39ab326aa77 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:58:01 +0900 Subject: [PATCH] fix #581, report dangerous indexing (#582) --- src/analyzers/jetanalyzer.jl | 8 ++++++++ test/analyzers/test_jetanalyzer.jl | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/analyzers/jetanalyzer.jl b/src/analyzers/jetanalyzer.jl index 6367351a9..f4a99a842 100644 --- a/src/analyzers/jetanalyzer.jl +++ b/src/analyzers/jetanalyzer.jl @@ -1148,6 +1148,14 @@ function report_serious_exception!(analyzer::JETAnalyzer, sv::InferenceState, ar return true end end + elseif widenconst(a) <: ArgumentError + # promote `ArgumentError` thrown by `to_index` method + # so that we get reports from dangerous indexing (aviatesk/JET.jl#581) + def = sv.linfo.def + if isa(def, Method) && def.name === :to_index + add_new_report!(analyzer, sv.result, SeriousExceptionReport(sv, ArgumentError("invalid index"), get_lin((sv, get_currpc(sv))))) + return true + end end end return false diff --git a/test/analyzers/test_jetanalyzer.jl b/test/analyzers/test_jetanalyzer.jl index 76acc7240..b792a31fd 100644 --- a/test/analyzers/test_jetanalyzer.jl +++ b/test/analyzers/test_jetanalyzer.jl @@ -428,6 +428,21 @@ end end end +func_invalid_index(xs, i) = xs[i] +func_invalid_index(xs::Vector{Int}) = xs[findfirst(>(0), xs)] +@testset "report invalid index" begin + let result = report_call(func_invalid_index, (Vector{Int},Nothing)) + @test count(get_reports_with_test(result)) do r + r isa SeriousExceptionReport + end == 1 + end + let result = report_call(func_invalid_index, (Vector{Int},)) + @test count(get_reports_with_test(result)) do r + r isa SeriousExceptionReport + end == 1 + end +end + @testset "DivideError" begin let result = report_call() do div(1, 0)