2011-01-12 4 views
0

я столкнулся следующее предупреждение системы безопасности для кода, указанных ниже:Missing Проверка по Null

if (null != FacesContext.getCurrentInstance()) { 

      FacesContext context = FacesContext.getCurrentInstance(); 

      if ((null != context.getApplication()) 
        && (null != context.getApplication().getVariableResolver())) { 

       if (null != context.getApplication().getVariableResolver() 
         .resolveVariable(context, "userBean")) { 

        Object requestObject = context.getApplication() 
          .getVariableResolver().resolveVariable(context, 
            "userBean"); 

        String pRange = ((UserBean) requestObject) 
          .getPageSize_REM(); 

        page_range = Integer.parseInt(pRange); 

       } 

      } 
     } 

предупреждение, что я получаю в FORTIFY Доклад является:

Аннотация: Метод getList() в GrantAccessBackingBean.java может разыменовать нулевой указатель в строке 2357, поскольку он не проверяет возвращаемое значение resolveVariable(), , которое m hight return null. Раковина: GrantAccessBackingBean.java:2353 requestObject = resolveVariable (...): VariableResolver.resolveVariable может возвращение NULL() 2351 .resolveVariable (контекст, "UserBean")) {2352 Объект requestObject = context.getApplication() 2353 .getVariableResolver(). ResolveVariable (контекст, 2354 «userBean»);

Хотя я проверять все нулевое эталонное состояние до сих пор она дает мне. Любое предложение ? Заранее спасибо

+5

Aahh. Условные обозначения Йоды. Прекрасный. –

+1

Что это касается безопасности? – skaffman

+0

@goreSplatter +1 @Vibhas http: // stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307 # 2430307 – zengr

ответ

2

Мое предположение было бы, что отчет не может определить, что

if (null != context.getApplication().getVariableResolver() 
         .resolveVariable(context, "userBean")) 

и

Object requestObject = context.getApplication() 
           .getVariableResolver() 
           .resolveVariable(context, "userBean"); 

оценки к тому же. Почему вы не изменить код

Object requestObject = context.getApplication() 
           .getVariableResolver() 
           .resolveVariable(context, "userBean"); 
if (requestObject != null) 
{ 
} 

И посмотреть, если это помогает.

(А если нет, то, по крайней мере, избавиться от повторяющихся вызовов, которые сейчас присутствует на каждый нулевой чек)

+0

Это должно решить проблему, как в исходном коде, нет гарантии, что * второй вызов * resolveVariable() не будет возвращать null (проверка выполняется только при вызове * first *). –

0

Существует не достаточно информации, чтобы сказать, является ли предоставление вашего инструмента статического осмотра хороший совет или нет.

Если "userBean" является управляемым компонентом, то нулевая проверка будет избыточной - она ​​будет создана экземпляром разрешения. Тем не менее, было бы лучше использовать JSF-инъекцию зависимостей, а не ручную проверку таким образом.

if(null != FacesContext.getCurrentInstance()) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     if ((null != context.getApplication()) 
       && (null != context.getApplication().getVariableResolver())) { 

Если этот код будет вызываться во время HTTP-запроса, все эти проверки недействительны. Недействительное состояние, в котором FacesContext.getCurrentInstance() возвращает null. Нулевые приложения и преобразователи указывают, что жизненный цикл не был правильно инициализирован (или настроен или снесен, и в этом случае он не будет обслуживать запросы). Что вы собираетесь делать, если не можете решить эту проблему? Если приложение переходит в недопустимое состояние, вы обычно должны просто пропускать код.