runtime error: left shift of negative value -1
runtime error: left shift of negative value -1
其实我在试这道题:
5.4 in 《破解编码interview:189编程题及解答,第五版》
问题是:
Given a positive integer, print the next smallest and the next largest number that have the same number of 1 bits in their binary representation.
有一个确切的same question,但答案都是错误的。
而且,我提问的目的是理解为什么代码不能通过ub检查器,而不是仅仅为了获得解决问题的思路。
0
leetcode 上“最后执行的输入”是什么意思?是不是输入导致错误的例子,如果是,为什么三个编译器都没有警告,即使我打开所有-Wall?
1
为什么书错了?
这是书中的代码:
class Solution {
public:
int getNext(int n)
{
int c = n;
int c0 = 0;
int c1 = 0;
while (((c & 1) == 0) && (c != 0))
{
c0++;
c >>= 1;
}
while ((c & 1) == 1)
{
c1++;
c >>= 1;
}
if (c0 + c1 == 31 || c0 + c1 == 0) { return -1; }
int p = c0 + c1;
n |= (1 << p);
n &= ~((1 << p) - 1);
n |= (1 << (c1 - 1)) - 1;
return n;
}
int getPrev(int n)
{
int temp = n;
int c0 = 0;
int c1 = 0;
while ((temp & 1) == 1)
{
c1++;
temp >>= 1;
}
if (temp == 0)return -1;
while (((temp & 1) == 0 )&& (temp != 0))
{
c0++;
temp >>= 1;
}
int p = c0 + c1;
n &= ((~0) << (p + 1));
int mask = (1 << (c1 + 1)) - 1;
n |= mask << (c0 - 1);
return n;
}
vector<int> findClosedNumbers(int num) {
int m = getNext(num);
int n = getPrev(num);
return {m,n};
}
};
错误输出为
Line 43: Char 14: runtime error: left shift of negative value -1 (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:53:14
我找到 ,它说“左移一个负值是未定义的行为”
但是为什么我在https://godbolt.org/用了所有能想到的Wall flags,却没有得到任何提示。
是否有一些标志可以像 UndefinedBehaviorSanitizer 一样显示它?
2.
某人的answer过不了
这个回答中提到的link不能通过lc,这是什么问题?
代码:
class Solution {
public:
vector<int> findClosedNumbers(int num) {
int m = getNextLarger(num);
int n = getNextSmaller(num);
return { m,n };
}
int getNextLarger(int num) {
if (num == 0 || num == -1)
return num;
// (1) add 1 to the last set bit
int largeNum = num + (num & ~(num - 1));
// (2) move the changed bits to the least significant bits. (right side)
int flipBits = num & ~largeNum;
int lastBits = 0;
while (flipBits != 0) {
flipBits &= flipBits - 1;
lastBits <<= 1;
lastBits |= 1;
}
lastBits >>= 1;
// (2.1) move bits to maintain the same number of set bits.
largeNum |= lastBits;
return largeNum;
}
//Unhandled exception at 0x0033F4B9 in leetcode.exe: 0xC00000FD: Stack overflow
int getNextSmaller(int num) { //with num=2
return ~getNextLarger(~num);
}
};
why the func can passed in msvc, clang, and gcc ,but just cannot pass the UndefinedBehaviorSanitizer?
因为编译器在编译时不知道操作数在运行时是什么值。如果编译器能够在编译时检测到所有 UB,那么 UB 消毒器就不会存在,因为它们是不必要的。
其实我在试这道题:
5.4 in 《破解编码interview:189编程题及解答,第五版》
问题是:
Given a positive integer, print the next smallest and the next largest number that have the same number of 1 bits in their binary representation.
有一个确切的same question,但答案都是错误的。 而且,我提问的目的是理解为什么代码不能通过ub检查器,而不是仅仅为了获得解决问题的思路。
0
leetcode 上“最后执行的输入”是什么意思?是不是输入导致错误的例子,如果是,为什么三个编译器都没有警告,即使我打开所有-Wall?
1
为什么书错了? 这是书中的代码:
class Solution {
public:
int getNext(int n)
{
int c = n;
int c0 = 0;
int c1 = 0;
while (((c & 1) == 0) && (c != 0))
{
c0++;
c >>= 1;
}
while ((c & 1) == 1)
{
c1++;
c >>= 1;
}
if (c0 + c1 == 31 || c0 + c1 == 0) { return -1; }
int p = c0 + c1;
n |= (1 << p);
n &= ~((1 << p) - 1);
n |= (1 << (c1 - 1)) - 1;
return n;
}
int getPrev(int n)
{
int temp = n;
int c0 = 0;
int c1 = 0;
while ((temp & 1) == 1)
{
c1++;
temp >>= 1;
}
if (temp == 0)return -1;
while (((temp & 1) == 0 )&& (temp != 0))
{
c0++;
temp >>= 1;
}
int p = c0 + c1;
n &= ((~0) << (p + 1));
int mask = (1 << (c1 + 1)) - 1;
n |= mask << (c0 - 1);
return n;
}
vector<int> findClosedNumbers(int num) {
int m = getNext(num);
int n = getPrev(num);
return {m,n};
}
};
错误输出为
Line 43: Char 14: runtime error: left shift of negative value -1 (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:53:14
我找到
但是为什么我在https://godbolt.org/用了所有能想到的Wall flags,却没有得到任何提示。 是否有一些标志可以像 UndefinedBehaviorSanitizer 一样显示它?
2.
某人的answer过不了
这个回答中提到的link不能通过lc,这是什么问题?
代码:
class Solution {
public:
vector<int> findClosedNumbers(int num) {
int m = getNextLarger(num);
int n = getNextSmaller(num);
return { m,n };
}
int getNextLarger(int num) {
if (num == 0 || num == -1)
return num;
// (1) add 1 to the last set bit
int largeNum = num + (num & ~(num - 1));
// (2) move the changed bits to the least significant bits. (right side)
int flipBits = num & ~largeNum;
int lastBits = 0;
while (flipBits != 0) {
flipBits &= flipBits - 1;
lastBits <<= 1;
lastBits |= 1;
}
lastBits >>= 1;
// (2.1) move bits to maintain the same number of set bits.
largeNum |= lastBits;
return largeNum;
}
//Unhandled exception at 0x0033F4B9 in leetcode.exe: 0xC00000FD: Stack overflow
int getNextSmaller(int num) { //with num=2
return ~getNextLarger(~num);
}
};
why the func can passed in msvc, clang, and gcc ,but just cannot pass the UndefinedBehaviorSanitizer?
因为编译器在编译时不知道操作数在运行时是什么值。如果编译器能够在编译时检测到所有 UB,那么 UB 消毒器就不会存在,因为它们是不必要的。