Fix casting to integer not to cause integer overflow. (#2930)

This commit is contained in:
Yutetsu TAKATSUKASA 2021-05-08 01:00:36 +09:00 committed by GitHub
parent b2139f65d8
commit 1e4839e5d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 16 additions and 17 deletions

View File

@ -646,17 +646,16 @@ std::string _vl_vsformat_time(char* tmp, double ld, bool left, size_t width) {
int shift = prec - userUnits + fracDigits; // 0..-15
double shiftd = vl_time_multiplier(shift);
double scaled = ld * shiftd;
QData fracDiv = static_cast<QData>(vl_time_multiplier(fracDigits));
QData whole = static_cast<QData>(scaled) / fracDiv;
QData fraction = static_cast<QData>(scaled) % fracDiv;
const double fracDiv = vl_time_multiplier(fracDigits);
const double whole = scaled / fracDiv;
int digits = 0;
if (!fracDigits) {
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%" VL_PRI64 "u%s", whole,
suffix.c_str());
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%.0f%s", whole, suffix.c_str());
} else {
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%" VL_PRI64 "u.%0*" VL_PRI64 "u%s",
whole, fracDigits, fraction, suffix.c_str());
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%.*f%s", fracDigits, whole,
suffix.c_str());
}
int needmore = width - digits;
std::string padding;
if (needmore > 0) padding.append(needmore, ' '); // Pad with spaces

View File

@ -3,11 +3,11 @@ Time scale of t is 100s / 10ms
[100000000] time%0d=10000 123%0t=1230000
dig%0t=0 dig%0d=0
rdig%0t=543 rdig%0f=0.054321
[0.000000ns] time%0d=10000 123%0t=12300000000000.000000ns
[1000000000000000.000000ns] time%0d=10000 123%0t=12300000000000.000000ns
dig%0t=0.000000ns dig%0d=0
rdig%0t=5432109876.543210ns rdig%0f=0.054321
[0.000000ns] stime%0t=0.000000ns stime%0d=10000 stime%0f=10000.000000
[0.000000ns] rtime%0t=0.000000ns rtime%0d=10000 rtime%0f=10000.000000
[1000000000000000.000000ns] stime%0t=1000000000000000.000000ns stime%0d=10000 stime%0f=10000.000000
[1000000000000000.000000ns] rtime%0t=1000000000000000.000000ns rtime%0d=10000 rtime%0f=10000.000000
global vpiSimTime = 0,100000000 vpiScaledRealTime = 1e+08
global vpiTimeUnit = -2 vpiTimePrecision = -2
top.t vpiSimTime = 0,100000000 vpiScaledRealTime = 10000

View File

@ -2,7 +2,7 @@
Time scale of t is 10ms / 10ns
[60000000] time%0d=60 123%0t=123000000
dig%0t=543000000 dig%0d=543
rdig%0t=543210987 rdig%0f=543.210988
rdig%0t=543210988 rdig%0f=543.210988
[600000000.000000ns] time%0d=60 123%0t=1230000000.000000ns
dig%0t=5430000000.000000ns dig%0d=543
rdig%0t=5432109876.543210ns rdig%0f=543.210988

View File

@ -2,7 +2,7 @@
Time scale of t is 1ms / 10ns
[6000000] time%0d=60 123%0t=12300000
dig%0t=543200000 dig%0d=5432
rdig%0t=543210987 rdig%0f=5432.109877
rdig%0t=543210988 rdig%0f=5432.109877
[60000000.000000ns] time%0d=60 123%0t=123000000.000000ns
dig%0t=5432000000.000000ns dig%0d=5432
rdig%0t=5432109876.543210ns rdig%0f=5432.109877

View File

@ -2,7 +2,7 @@
Time scale of t is 1ns / 1ns
[60] time%0d=60 123%0t=123
dig%0t=5432109877 dig%0d=5432109877
rdig%0t=5432109876 rdig%0f=5432109876.543210
rdig%0t=5432109877 rdig%0f=5432109876.543210
[60.000000ns] time%0d=60 123%0t=123.000000ns
dig%0t=5432109877.000000ns dig%0d=5432109877
rdig%0t=5432109876.543210ns rdig%0f=5432109876.543210

View File

@ -7,7 +7,7 @@ Time scale of t is 1ps / 1fs
dig%0t=5432109876.543000ns dig%0d=5432109876543
rdig%0t=5432109876.543209ns rdig%0f=5432109876543.209961
[0.060000ns] stime%0t=0.060000ns stime%0d=60 stime%0f=60.000000
[0.060000ns] rtime%0t=0.059999ns rtime%0d=60 rtime%0f=60.000000
[0.060000ns] rtime%0t=0.060000ns rtime%0d=60 rtime%0f=60.000000
global vpiSimTime = 0,60000 vpiScaledRealTime = 60000
global vpiTimeUnit = -12 vpiTimePrecision = -15
top.t vpiSimTime = 0,60000 vpiScaledRealTime = 60

View File

@ -2,7 +2,7 @@
Time scale of t is 1s / 10ns
[6000000000] time%0d=60 123%0t=12300000000
dig%0t=500000000 dig%0d=5
rdig%0t=543210987 rdig%0f=5.432110
rdig%0t=543210988 rdig%0f=5.432110
[60000000000.000000ns] time%0d=60 123%0t=123000000000.000000ns
dig%0t=5000000000.000000ns dig%0d=5
rdig%0t=5432109876.543210ns rdig%0f=5.432110

View File

@ -2,12 +2,12 @@
Time scale of t is 1us / 1ns
[60000] time%0d=60 123%0t=123000
dig%0t=5432110000 dig%0d=5432110
rdig%0t=5432109876 rdig%0f=5432109.876543
rdig%0t=5432109877 rdig%0f=5432109.876543
[60000.000000ns] time%0d=60 123%0t=123000.000000ns
dig%0t=5432110000.000000ns dig%0d=5432110
rdig%0t=5432109876.543209ns rdig%0f=5432109.876543
[60000.000000ns] stime%0t=60000.000000ns stime%0d=60 stime%0f=60.000000
[60000.000000ns] rtime%0t=59999.999999ns rtime%0d=60 rtime%0f=60.000000
[60000.000000ns] rtime%0t=60000.000000ns rtime%0d=60 rtime%0f=60.000000
global vpiSimTime = 0,60000 vpiScaledRealTime = 60000
global vpiTimeUnit = -6 vpiTimePrecision = -9
top.t vpiSimTime = 0,60000 vpiScaledRealTime = 60