Issue 130484
Summary [Question] Is (volatile long double) 0 output from 'ta v' command a bug?
Labels new issue
Assignees
Reporter kaixinlalala
    When using the `ta v` command in LLDB, the output for a variable is `(volatile long double) 0`. I am not sure if this is expected behavior or a potential bug, so I would like to confirm with the developers.

Test Case:

```
#include<functional>
#include<tuple>
#include<variant>
#include<type_traits>
#include<any>
#include<utility>
#include<iostream>

class Container_1 {
private:
    unsigned char member_5;
public:
    unsigned char member_4;

    // Constructor
    Container_1(unsigned char member_4_val, unsigned char member_5_val)
        : member_4(member_4_val), member_5(member_5_val) {}
    // Destructor
    ~Container_1() {}
};

class Container_2 : public Container_1 {
public:
    long long member_6;
    double member_7;
    Container_1 member_11;

    // Constructor
    Container_2(long long member_6_val, double member_7_val,
                unsigned char member_4_val, unsigned char member_5_val)
        : Container_1(member_4_val, member_5_val),
          member_6(member_6_val), member_7(member_7_val), member_11(member_4_val, member_5_val) {}
    // Destructor
    ~Container_2() {}
};

// Container_3 class implementation
class Container_3 : public Container_1 {
public:
    float member_8;
    double member_9;
    double member_10;

    // Constructor
    Container_3(float member_8_val, double member_9_val, double member_10_val,
                unsigned char member_4_val, unsigned char member_5_val)
        : Container_1(member_4_val, member_5_val),
          member_8(member_8_val), member_9(member_9_val), member_10(member_10_val) {}
    // Destructor
    ~Container_3() {}
};

float func8(int p_0)
{
    float var335 = 0.5f, var336 = 1.5f, var337 = 2.5f;
    int var338 = p_0 + static_cast<int>(var337);
    float var339 = var335 + var336 + var337;
    for (int i = 0; i < 10; ++i) {
        float var340 = 3.5f, var341 = 4.5f, var342 = 5.5f;
        float var343 = var335 + var336 + var337 + var339;
        int* var344 = &p_0;
    }
    return var336;
}

template<typename T1>
long double func10(T1 p_0,int p_1,double p_2)
{
    static volatile long double var36 = 0.0;
    static volatile double var37 = p_2 + p_1;
    static volatile double var38 = p_2 * var37;

    if (var38 > 100.0) {
        static volatile long double var39 = var38 + p_1;
        static volatile long double var40 = var37 * p_2;
        static long double var41 = p_1 * var39;
        static volatile T1 var42 = p_0 + var38;
        static volatile long double var43 = var36 + var39 + var40 + var41;
        static volatile float var44 = func8(p_1);

        if (var43 > 200.0) {
            static volatile long double var45 = var43 * 1.5;
            static volatile long double var46 = var45 / 2.0;
            static volatile long double var47 = var46 - var43;
            static volatile int* var48 = &p_1;
            static volatile float* var49 = &var44;

            func8(*var48);
            var44 = *var49;
        }
    }
    return var36;
}

// Global variables
unsigned long int var505;
unsigned int var506;
int var507;
unsigned int* var508;
Container_3 var509(1.5f, 2.5, 3.5, 10, 20);
long int var510;
long double var511;
int main()
{
    // Local variables updating global variables
    var505 = 100;
    var506 = 200;
    var507 = 300;
    var508 = &var506;
    var510 = 400;
    var511 = func10(var509.member_10, var507, var509.member_9);
    var509.member_4 = static_cast<unsigned char>(var509.member_4 + var511);
    if (var509.member_9 > var509.member_10) {
        unsigned long int var512 = 500;
        unsigned int var513 = var506 + *var508;
        unsigned int var514 = var506 + *var508 + var513;
        var509.member_9 = 4.5;
        var509.member_10 = 5.5;
        var509.member_8 = 6.5f;
        var509.member_8 = static_cast<float>(var510);
        var510 = static_cast<long int>(var509.member_9);
    } else {
        // Alternative block
    }
    return 0;
}
```

The result printed by lldb:

```
(lldb) target create "./test_case_0.o"
Current executable set to '/home/hzw/debugger-test/gen_progs/1740728492_BG85H39g/reduced_test_case/test_case_0.o' (x86_64).
(lldb) b func10
Breakpoint 1: where = test_case_0.o`long double func10<double>(double, int, double) + 21 at test_case_0.cpp:82:5, address = 0x00000000000014b5
(lldb) r
Process 290875 launched: '/home/hzw/debugger-test/gen_progs/1740728492_BG85H39g/reduced_test_case/test_case_0.o' (x86_64)
Process 290875 stopped
* thread #1, name = 'test_case_0.o', stop reason = breakpoint 1.1
    frame #0: 0x00005555555554b5 test_case_0.o`long double func10<double>(p_0=3.5, p_1=300, p_2=2.5) at test_case_0.cpp:82:5
   79   {
   80       static volatile long double var36 = 0.0;
   81  
-> 82       static volatile double var37 = p_2 + p_1;
   83       static volatile double var38 = p_2 * var37;
   84  
   85       if (var38 > 100.0) {
(lldb) ta v
Global variables for /home/hzw/debugger-test/gen_progs/1740728492_BG85H39g/reduced_test_case/test_case_0.cpp in /home/hzw/debugger-test/gen_progs/1740728492_BG85H39g/reduced_test_case/test_case_0.o:
(int) ::var507 = 300
(long) ::var510 = 400
(unsigned int *) ::var508 = 0x0000555555558070
(Container_3) ::var509 = {
  Container_1 = (member_5 = '\x14', member_4 = '\n')
  member_8 = 1.5
  member_9 = 2.5
  member_10 = 3.5
}
(unsigned int) ::var506 = 200
(unsigned long) ::var505 = 100
(std::ios_base::Init) std::__ioinit = <incomplete type "std::ios_base::Init">
(long double) ::var511 = 0
(lldb) p var36 
(volatile long double) 0
(lldb) n
Process 290875 stopped
* thread #1, name = 'test_case_0.o', stop reason = step over
    frame #0: 0x00005555555554f1 test_case_0.o`long double func10<double>(p_0=3.5, p_1=300, p_2=2.5) at test_case_0.cpp:83:5
   80       static volatile long double var36 = 0.0;
   81  
   82       static volatile double var37 = p_2 + p_1;
-> 83       static volatile double var38 = p_2 * var37;
   84  
   85       if (var38 > 100.0) {
   86           static volatile long double var39 = var38 + p_1;
(lldb) fr v
(double) p_0 = 3.5
(int) p_1 = 300
(double) p_2 = 2.5
(lldb) n   
Process 290875 stopped
* thread #1, name = 'test_case_0.o', stop reason = step over
    frame #0: 0x0000555555555530 test_case_0.o`long double func10<double>(p_0=3.5, p_1=300, p_2=2.5) at test_case_0.cpp:85:9
   82       static volatile double var37 = p_2 + p_1;
   83       static volatile double var38 = p_2 * var37;
   84  
-> 85       if (var38 > 100.0) {
   86           static volatile long double var39 = var38 + p_1;
   87           static volatile long double var40 = var37 * p_2;
   88           static long double var41 = p_1 * var39;
(lldb) 
Process 290875 stopped
* thread #1, name = 'test_case_0.o', stop reason = step over
    frame #0: 0x000055555555554a test_case_0.o`long double func10<double>(p_0=3.5, p_1=300, p_2=2.5) at test_case_0.cpp:86:9
   83       static volatile double var38 = p_2 * var37;
   84  
   85       if (var38 > 100.0) {
-> 86           static volatile long double var39 = var38 + p_1;
   87           static volatile long double var40 = var37 * p_2;
   88           static long double var41 = p_1 * var39;
   89  
(lldb) fr v
(double) p_0 = 3.5
(int) p_1 = 300
(double) p_2 = 2.5
(lldb) p var39
(volatile long double) 0
(lldb) q   
Quitting LLDB will kill one or more processes. Do you really want to proceed: [Y/n] y
```

Compilation command:

```
clang++ test_case_0.cpp -O0 -o test_case_0.o -g
```

Compile Version: clang version 19.1.7
Debugger Version: lldb version 19.1.7
Operating System Version: Ubuntu 22.02
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to