vabridgers updated this revision to Diff 481940.
vabridgers added a comment.

correct handling of sign type per @steakhal comments. Thank you, sir :)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139759/new/

https://reviews.llvm.org/D139759

Files:
  clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h
  clang/test/Analysis/fixed-point.c
  clang/unittests/StaticAnalyzer/APSIntTypeTest.cpp
  clang/unittests/StaticAnalyzer/CMakeLists.txt

Index: clang/unittests/StaticAnalyzer/CMakeLists.txt
===================================================================
--- clang/unittests/StaticAnalyzer/CMakeLists.txt
+++ clang/unittests/StaticAnalyzer/CMakeLists.txt
@@ -5,6 +5,7 @@
 
 add_clang_unittest(StaticAnalysisTests
   AnalyzerOptionsTest.cpp
+  APSIntTypeTest.cpp
   BugReportInterestingnessTest.cpp
   CallDescriptionTest.cpp
   CallEventTest.cpp
Index: clang/unittests/StaticAnalyzer/APSIntTypeTest.cpp
===================================================================
--- /dev/null
+++ clang/unittests/StaticAnalyzer/APSIntTypeTest.cpp
@@ -0,0 +1,63 @@
+//===- unittest/StaticAnalyzer/AnalyzerOptionsTest.cpp - SA Options test --===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Basic/Builtins.h"
+#include "clang/Basic/FileManager.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Basic/TargetInfo.h"
+#include "clang/StaticAnalyzer/Core/Checker.h"
+#include "clang/StaticAnalyzer/Core/PathSensitive/RangedConstraintManager.h"
+#include "clang/Tooling/Tooling.h"
+#include "llvm/ADT/APSInt.h"
+#include "llvm/Support/raw_ostream.h"
+#include "gtest/gtest.h"
+
+namespace clang {
+namespace ento {
+
+TEST(getAPSIntTypeTest, foo) {
+  std::unique_ptr<ASTUnit> AST = tooling::buildASTFromCode("");
+  ASTContext &Context = AST->getASTContext();
+  llvm::BumpPtrAllocator Arena;
+  BasicValueFactory BVF{Context, Arena};
+
+  APSIntType ty = BVF.getAPSIntType(Context.LongAccumTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getLongAccumWidth());
+  EXPECT_FALSE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.UnsignedLongAccumTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getLongAccumWidth());
+  EXPECT_TRUE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.LongFractTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getLongFractWidth());
+  EXPECT_FALSE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.UnsignedLongFractTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getLongFractWidth());
+  EXPECT_TRUE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.SignedCharTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getCharWidth());
+  EXPECT_FALSE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.UnsignedCharTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getCharWidth());
+  EXPECT_TRUE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.LongTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getLongWidth());
+  EXPECT_FALSE(ty.isUnsigned());
+
+  ty = BVF.getAPSIntType(Context.UnsignedLongTy);
+  EXPECT_TRUE(ty.getBitWidth() == Context.getTargetInfo().getLongWidth());
+  EXPECT_TRUE(ty.isUnsigned());
+}
+
+} // end namespace ento
+} // end namespace clang
Index: clang/test/Analysis/fixed-point.c
===================================================================
--- /dev/null
+++ clang/test/Analysis/fixed-point.c
@@ -0,0 +1,65 @@
+// RUN: %clang_analyze_cc1 -ffixed-point \
+// RUN:   -analyzer-checker=core,debug.ExprInspection -verify %s
+
+// expected-no-diagnostics
+
+// Check that getAPSIntType does not crash
+// when using fixed point types.
+
+enum en_t { en_0 = 1 };
+
+void _enum(int c) {
+  (void)((enum en_t) c >> 4);
+}
+
+void _inttype(int c) {
+  (void)(c >> 4);
+}
+
+void _accum(int c) {
+  (void)((_Accum) c >> 4);
+}
+
+void _fract(int c) {
+  (void)((_Fract) c >> 4);
+}
+
+void _long_fract(int c) {
+  (void)((long _Fract) c >> 4);
+}
+
+void _unsigned_accum(int c) {
+  (void)((unsigned _Accum) c >> 4);
+}
+
+void _short_unsigned_accum(int c) {
+  (void)((short unsigned _Accum) c >> 4);
+}
+
+void _unsigned_fract(int c) {
+  (void)((unsigned _Fract) c >> 4);
+}
+
+void sat_accum(int c) {
+  (void)((_Sat _Accum) c >> 4);
+}
+
+void sat_fract(int c) {
+  (void)((_Sat _Fract) c >> 4);
+}
+
+void sat_long_fract(int c) {
+  (void)((_Sat long _Fract) c >> 4);
+}
+
+void sat_unsigned_accum(int c) {
+  (void)((_Sat unsigned _Accum) c >> 4);
+}
+
+void sat_short_unsigned_accum(int c) {
+  (void)((_Sat short unsigned _Accum) c >> 4);
+}
+
+void sat_unsigned_fract(int c) {
+  (void)((_Sat unsigned _Fract) c >> 4);
+}
Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h
===================================================================
--- clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h
+++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h
@@ -152,9 +152,13 @@
       T = AT->getValueType();
     }
 
-    assert(T->isIntegralOrEnumerationType() || Loc::isLocType(T));
-    return APSIntType(Ctx.getIntWidth(T),
-                      !T->isSignedIntegerOrEnumerationType());
+    if (T->isIntegralOrEnumerationType() || Loc::isLocType(T)) {
+      return APSIntType(Ctx.getIntWidth(T),
+                        !T->isSignedIntegerOrEnumerationType());
+    } else if (T->isFixedPointType()) {
+      return APSIntType(Ctx.getIntWidth(T), !T->isSignedFixedPointType());
+    }
+    llvm_unreachable("Unsupported type in getAPIntType!");
   }
 
   /// Convert - Create a new persistent APSInt with the same value as 'From'
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to