Coverage Report

Created: 2020-09-22 08:39

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/StaticAnalyzer/Core/APSIntType.cpp
Line
Count
Source
1
//===--- APSIntType.cpp - Simple record of the type of APSInts ------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h"
10
11
using namespace clang;
12
using namespace ento;
13
14
APSIntType::RangeTestResultKind
15
APSIntType::testInRange(const llvm::APSInt &Value,
16
795k
                        bool AllowSignConversions) const {
17
18
  // Negative numbers cannot be losslessly converted to unsigned type.
19
795k
  if (IsUnsigned && 
!AllowSignConversions397k
&&
20
616
      Value.isSigned() && 
Value.isNegative()24
)
21
8
    return RTR_Below;
22
23
795k
  unsigned MinBits;
24
795k
  if (AllowSignConversions) {
25
649k
    if (Value.isSigned() && 
!IsUnsigned252k
)
26
252k
      MinBits = Value.getMinSignedBits();
27
397k
    else
28
397k
      MinBits = Value.getActiveBits();
29
30
146k
  } else {
31
    // Signed integers can be converted to signed integers of the same width
32
    // or (if positive) unsigned integers with one fewer bit.
33
    // Unsigned integers can be converted to unsigned integers of the same width
34
    // or signed integers with one more bit.
35
146k
    if (Value.isSigned())
36
145k
      MinBits = Value.getMinSignedBits() - IsUnsigned;
37
632
    else
38
632
      MinBits = Value.getActiveBits() + !IsUnsigned;
39
146k
  }
40
41
795k
  if (MinBits <= BitWidth)
42
795k
    return RTR_Within;
43
44
133
  if (Value.isSigned() && 
Value.isNegative()111
)
45
75
    return RTR_Below;
46
58
  else
47
58
    return RTR_Above;
48
133
}