JD.UNCAUGHT

JD.UNCAUGHT 是一种强大的自定义检查器,用于检查参数中列出的方法,但不能间接捕获其主体内引发的所有异常。列出的已检查异常也是参数。JD.UNCAUGHT 报告了一个异常列表,从理论上讲,这些异常可由方法主体引发,可能需要一个能够捕获所有异常的安全保障 - 最顶层的 catch 块。默认情况下,该方法列表包括 servlet 入口点:doGet、doPost、Thread.run() 和 main() 方法。

漏洞与风险

如果未处理的异常没有被 servlet 入口方法捕获,则可能会导致系统信息泄露(如 stacktrace)和 XSS 错误。然而,该框架支持特殊方法,需要对这种方法进行定义以使其能够处理异常。但如果实施了特殊方法,则应忽略该错误。对于 Thread.run() 方法,未捕获的异常会导致线程意外终止,并可能导致死锁。对于 main() 方法,未捕获的异常会导致 JVM 停止。

缓解与预防

将方法主体置于可捕获所有异常的 try 块中,并创建可处理异常的有效步骤。对于 servlet,在服务器日志中报告堆栈跟踪,而不要向用户报告!

示例 1

复制
     protected void doPost(HttpServletRequest req, //
                           HttpServletResponse arg1) //
             throws ServletException, IOException {
         String ip = req.getRemoteAddr();
         InetAddress addr = InetAddress.getByName(ip);
         // ...
         arg1.getOutputStream().println("Host name is " +
                                        addr.getHostName());
         foo();
     }
 
     static class Ex1 extends RuntimeException { }
 
     private static void foo() throws Ex1 {
         throw new Ex1();
     }

针对第 16 行的方法 doPost 声明报告 JD.UNCAUGHT:方法“doPost”未捕获异常“com.klocwork.jdefects.checkers.ast.samples.JD_UNCAUGHT_Sample_1$Ex1”。