https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91774

            Bug ID: 91774
           Summary: Assignment from return value of function to reference
                    returned by function occasionally produces wrong
                    results
           Product: gcc
           Version: 7.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: smartman1996 at gmail dot com
  Target Milestone: ---

Created attachment 46885
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46885&action=edit
Original source file producing the bug.

PRIOR NOTIFICATION: this is a bug that has a temporary detouring solution with
an equivalent statement.
refer to number 7

ANOTHER NOTE: I am trying to minimize the source for reproducing the bug, but
the bug seems to show itself on very complex situations. I will report as soon
as possible.


2. System Environment Information

TestMachine #1

NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"

4.15.0-1048-aws

TestMachine #2

OS 이름:                 Microsoft Windows 7 Home Premium K 
OS 버전:                 6.1.7601 Service Pack 1 빌드 7601
OS 제조업체:             Microsoft Corporation
OS 구성:                 독립 실행형 워크스테이션
OS 빌드 종류:            Multiprocessor Free
시스템 제조업체:         SAMSUNG ELECTRONICS CO.,LTD
시스템 모델:             Samsung Desktop System
시스템 종류:             x64-based PC
프로세서:                프로세서 1개 설치됨
                         [01]: Intel64 Family 6 Model 42 Stepping 7
GenuineIntel ~3101Mhz

//Sorry for the locale and language of the local pc

3. Options for reproduction of bug

build was performed by using make

contents of the Makefile:

main: main.o
        g++ -std=c++14 -Wall -O2 -g -o bin/main bin/main.o

main.o:
        g++ -std=c++14 -Wall -O2 -g -c -o bin/main.o src/main.cpp

clear:
        rm -f *.o bin/*.o bin/main

//end of contents of the Makefile

note: the bugs were also reproduced with -std=c++11, or without -O2

4. Complete commandline that triggers the bug

The source file was developed as a university undergraduate project.
The content is a Scheme Interpreter, yet a prototype.
It only does parsing, and does not do anything further.

providing the given testcase "testinput.txt" produces the bug

5. Compiler Output such error messages, warnings, etc.

Error Messages and Warnings were fully eliminated in the process of debugging

Therefore, no messages were produced with -Wall -Wextra

6. Test Case for Reproduction (as input)

content of testinput:

((dvo) wji (qbr) (ndo) qbr (kfh) (dvp) pzo (oos) (rmy) xuk xug fiv cks wjj zhn
(wjh) uwa lql kfe (ckk) lqm ckp ooq uwc pzt xul xun fis qbz )

EXIT

//end of content of testinput

7. description of bug (on the perspective of the user)

using language C++14
this is a broad description

suppose there are two classes A, B, and a struct type SAMPLETYPE

    typedef struct{
        CHILDTYPE x, y;
    } SAMPLETYPE; 

    class A{
        SAMPLETYPE * data;

        SAMPLETYPE & operator [] (size_t index){
            return data[index];
        }
    }

    class B{
        _TYPE CalcFunc(){

            while(){
                // some while loop triggered on some condition
            }

            return (some calculation result);
            }
    }

The statement that triggers the bug:

    A a;
    B b;
    auto index = (something);

    a[index].x = b.CalcFunc();

The equivalent statement that avoids the bug:

    A a;
    B b;
    auto index = (something);

    {
        auto temp = b.CalcFunc();
        a[index].x = temp;
    }


summary:
    if the left operand is a reference returned by operator []
    and if the right operand is a calculation
    and if the calculation by the calcfunc got the while loop triggered
previously

    then the return value is stored in the reference with a difference of -1

    Note that the return value is correct if printed out.

    The bug is suspected to be related with the assignment and reference.

    Though this could be avoided if we detour through a temporary local
variable as above.

8. additional note

as a student, I tested on MSVC and it did not represent a bug.

information about the test version of MSVC:

Microsoft Visual Studio Community 2019
Version 16.2.3

_MSC_VER has value 1922
_MSC_FULL_VER has value 192227905

System Environment Information of that ran MSVC:

OS 이름:                 Microsoft Windows 10 Education
OS 버전:                 10.0.17134 N/A 빌드 17134
OS 제조업체:             Microsoft Corporation
OS 구성:                 독립 실행형 워크스테이션
OS 빌드 종류:            Multiprocessor Free
시스템 제조업체:         TRIGEM COMPUTER
시스템 모델:             TG DESKTOP PC
시스템 종류:             x64-based PC
프로세서:                프로세서 1개 설치됨
                         [01]: Intel64 Family 6 Model 158 Stepping 10
GenuineIntel ~3000Mhz
BIOS 버전:               American Megatrends Inc. 2.00(F), 2019-05-06

Another Test on the same machine:

with gcc, g++ 8.3.0 reproduced the same results

Reply via email to