接続数

COUNTER367288FROM 2012/5/16

MISRA-C diary(C言語日誌)

MISRA-C >> Article details

2014/06/11

C++N3242, 2011(3)1 General 1.9 Program execution

Tweet ThisSend to Facebook | by kaizen
// 1 filename:cpp2011-1-9.cpp
// ver 0.1 June.10, 2014
//
// 2 original examples and/or notes:
// (c) ISO/IEC JTC1 SC22 WG21 N3242, April 12, 2011
//
// 3 compile and output mechanism:
// (c) Ogawa Kiyoshi, kaizen@gifu-u.ac.jp,
//
// 4 compile errors and/or wornings:
// 4.1(c) Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
// Target: x86_64-apple-darwin13.2.0,  Thread model: posix
// Command/Options: c++ -std=c++11 -stdlib=libc++ -Wall cpp2011-1-9.cpp 
// (c) LLVM 2003-2009 University of Illinois at Urbana-Champaign.

// 4.2. g++-4.9 (GCC) 4.9.0 20131229 (experimental)
// Copyright (C) 2013 Free Software Foundation, Inc.
// This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// http://gcc.gnu.org/onlinedocs/gcc/Standards.html
// Command/Options: g++-4.9  -std=c++11  -Wall cpp2011-1-9.cpp 
// g++-4.9: error: unrecognized command line option '-stdlib=libc++'
// Configuration:brew install gcc49
//
// 4.3. Visual Studio Express 2013, 
// (c) Microsoft http://www.visualstudio.com/
// SPEC:
// Windows 7, .NET Framework
// (c) VMware, Inc.
// VMWare fusion 6
//
// 5. Hardware:  MacBook Pro, 
//(c) Intel http://ark.intel.com/products/37006/
//Core 2 Duo 2.53GHz, 8GB, 1067MHz DDR3
//
// 6. Special Thanks: Upper organizatios and 
// ITSCJ/IPSJ http://www.itscj.ipsj.or.jp/itscj_english/index.html
// NPO SESSAME project, http://www.sessame.jp/workinggroup/WorkingGroup3/
// Toyo Corporation, http://www.toyo.co.jp/English/
// Japan Standard Association, http://bit.ly/1lzykg1
// NPO TOPPERS project, https://www.toppers.jp/asp-d-download.html
// Daido Universcity, http://www.daido-it.ac.jp/gakubugakka/computer/index.html
// WITZ Co.Ltd., http://www.witz-inc.co.jp/products/solution/solution.html
// SevenWise.co., http://www.7ws.co.jp/index.html
// TOYOTA Motor Corporation, http://toyota.jp/
// IT planning Inc., http://www.itpl.co.jp/en/index.html
// DENSO Corporation, http://www.globaldenso.com/en/
// Aisin Seiki co. Ltd., http://www.aisin.com/
// Spancion Inc., http://www.spansion.com/
// Yazaki Corporation, http://www.yazaki-group.com/global/
// Pananosic Corporation, http://www.panasonic.net/
// SWEST: Summer Workshop on Embedded System Technologies , http://swest.toppers.jp
// CEST: Consortium for Embedded System Technology, http://www.ertl.jp/CEST/
// JUSE: Union of Japanese Scientists and Engineers, http://www.juse.or.jp/e/
// OSC:Open Source Conference, http://www.ospn.jp/

#include <iostream>
using namespace std;
struct S {
S(int i): I(i) { }
int& v() { return I; }
private:
int I;
};
S s1(1); // full-expression is call of S::S(int)
S s2 = 2; // full-expression is call of S::S(int)

void f() {
if (S(3).v()){ // full-expression includes lvalue-to-rvalue and
cout <<s2.v() <<std::endl;
} else {
cout << s1.v() <<std::endl;
// int to bool conversions, performed before
// temporary is deleted at end of full-expression
}
}

void f2(int, int);
void g(int i, int* v) {
i = v[i++]; // the behavior is undefined
cout <<i<< std::endl;
i = 7, i++, i++; // i becomes 9
cout <<i<< std::endl;
i = i++ + 1; // the behavior is undefined
cout <<i<< std::endl;
i = i + 1; // the value of i is incremented
cout <<i<< std::endl;
f2(i = -1, i = -1); // the behavior is undefined
}

void f2(int i, int j){
if ( i==j){
cout << (i==j) << std::endl;
}else {
cout <<i << j<<std::endl;
}
}

int main()
{
int a, b;
/* ... */
a=1;
b=1;
a = a + 32760 + b + 5;
cout << a<<std::endl;
a = (((a + 32760) + b) + 5);
cout << a<<std::endl;
a = ((a + b) + 32765);
cout <<a<<std::endl;
a = ((a + 32765) + b);
cout << a<<std::endl;
a = (a + (b + 32765));
cout << a<< std::endl;
f();
g(1,&a);
return a;
}
// 1. warning 
// 1.1 LLVM
//cpp2011-1-9.cpp:80:9: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
//        i = v[i++]; // the behavior is undefined
//          ~    ^
//cpp2011-1-9.cpp:84:7: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
//        i = i++ + 1; // the behavior is undefined
//          ~  ^
//cpp2011-1-9.cpp:88:6: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
//f2(i = -1, i = -1); // the behavior is undefined
//     ^       ~
//3 warnings generated.
// 1.2 gcc4.9 
//cpp2011-1-9.cpp: In function 'void g(int, int*)':
//cpp2011-1-9.cpp:80:12: warning: operation on 'i' may be undefined [-Wsequence-point]
//  i = v[i++]; // the behavior is undefined
//            ^
//cpp2011-1-9.cpp:84:13: warning: operation on 'i' may be undefined [-Wsequence-point]
//  i = i++ + 1; // the behavior is undefined
//             ^
//cpp2011-1-9.cpp:88:19: warning: operation on 'i' may be undefined [-Wsequence-point]
// f2(i = -1, i = -1); // the behavior is undefined
//                   ^
// 2. output
// 2.1 LLVM
//32767
//65533
//98299
//131065
//163831
//2
//0
//9
//10
//11
//1
// 2.2 gcc4.9
//32767
//65533
//98299
//131065
//163831
//2
//1
//9
//10
//11
//1

20180423追記

## Compiler
###clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

###g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

$ ../cppgl17.sh cpp2011-1-9

$ clang++ cpp2011-1-9.cpp -std=c++17 

cpp2011-1-9.cpp:81:8: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]

i = v[i++]; // the behavior is undefined

  ~    ^

cpp2011-1-9.cpp:85:6: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]

i = i++ + 1; // the behavior is undefined

  ~  ^

cpp2011-1-9.cpp:89:6: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]

f2(i = -1, i = -1); // the behavior is undefined

     ^       ~

3 warnings generated.

32767

65533

98299

131065

163831

2

0

9

10

11

1


$ g++-7 cpp2011-1-9.cpp -std=c++17 

32767

65533

98299

131065

163831

2

1

9

10

11

1


--cppgl17.sh

#!/bin/sh

echo "$ clang++ $1.cpp -std=c++17 "

clang++ $1.cpp -std=c++17 -o $1l

if [  -e $1l ]; then

./$1l $2

fi

echo "\r"

echo "$ g++-7 $1.cpp -std=c++17 "

g++-7 $1.cpp  -std=c++17 -o $1g

if [  -e $1g ]; then

./$1g $2

fi



<この稿は書きかけです。順次追記しています。>
twitter:@kaizen_nagoya
17:13 | Impressed! | Voted(0) | Comment(0)