Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

MISRA C.2.1 Type widening in integer promotion,(wicm3.c )

MISRA Cのコード断片をコンパイルして記録した。
https://researchmap.jp/joqmhv6vj-1797580/?lang=japanese

misra-c-2-1-ex-ui-wincm3.c
// 1. filename: misra-C-2-1-ex-ui-wicm3.c 
//          misra-C-2-1-ex-ui-wcm2.c
//      misra-C-2-1-ex-ui-wcm.c
// 2. original examples and/or notes: from
//      (c) MIRA Limited March, 2013 http://www.misra-c.com/
//      MISRA C:2012
//      MISRA C.2.1 Type widening in integer promotion, 
//      UI:uint32_t unsigned int, WICM:with initialization,cast, macro and something)
// 3. compile and output mechanism: by 
//      (c) Ogawa Kiyoshi, January.04, 2014 http ://researchmap.jp/kaizen/MISRA-C/
//      @kaizen_nagoya, kaizen@gifu - u.ac.jp
// 4.compile errors and/or wornings: using
// 4.1.Xcode 5.0/LLVM version 4.2 (clang-425.0.27) (based on LLVM 3.2svn), C90/C99, 32/64 bit
//      Target: x86_64-apple-darwin11.4.2 //Thread model: posix
//      (c) Apple https://developer.apple.com/xcode/
//          OSX 10.9.1 
//      (c) LLVM 2003-2009 University of Illinois at Urbana-Champaign.
// 4.2. gcc-4.9 (GCC) 4.9.0 20131229 (experimental) C90/C99/C2011, 32/64 bit, http://gcc.gnu.org/onlinedocs/gcc/Standards.html
//      Copyright (C) 2013 Free Software Foundation, Inc. http://gcc.gnu.org/gcc-4.9/changes.html
// 4.3. Visual Studio Express 2013, most of C99/C11 that is a subset of ISO C++98/C++11.http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2089423-c99-support
//      (c) Microsoft http://www.visualstudio.com/
//          Windows 7, .NET Framework
// http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
//          ***********************************************************************/
//          ConsoleApplication1.cpp : 
#include "stdafx.h"
//          If you are not use MS Windows, you may make stdfx.h like this 
//          #ifndef _WIN32
//          #define __stdafx_h__
//          #define _NO_WIN32
//          // http://social.msdn.microsoft.com/Forums/vstudio/en-US/88339ac0-678d-41d7-a421-519462087277/visual-studio-2008-wont-find-ifdef-win32?forum=vcgenera
//          #endif //
//      (c) VMware, Inc.
//          VMWare fusion 6
// 4.4 M3T-NC30WA V.5.45 Release 01
//      (c) Renesas Electronics Corporation.http://www.renesas.com/products/mpumcu/m16c/
//          ***********************************************************************/
//          *                                                                     */
//          *  FILE        :MISRAC_C_2_1.c                                        */
//          *  DATE        :Tue, Jan 07, 2014                                     */
//          *   DESCRIPTION :main program file.                                    */
//          *  CPU GROUP   :10                                                    */
//          *                                                                     */
//          *  This file is generated by Renesas Project Generator (Ver.4.19).    */
//          *  NOTE:THIS IS A TYPICAL EXAMPLE.                                    */
// 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 
//      NPO SESSAME project, http://www.sessame.jp/workinggroup/WorkingGroup3/
//      Toyo Corporation, http://www.toyo.co.jp/English/
//      ISO/IEC JTC1 SC22 WG14, http://www.open-std.org/jtc1/sc22/wg14/www/standards
//      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/
#define __MISRA_C_C_2_1_
#include "misra_c.h"
#include <stdio.h>
#include <limits.h>

int main(void){
uint8_t ua = 200, ub =200 ;
uint16_t uc = 40000, ud = 30000;
uint32_t ue = 2000000000, uf = 2000000000;
uint32_t ug = 2000000000, uh = 3000000000;
uint32_t ui = 4000000000, uj = 5000000000;
uint64_t uk = 9000000000000000000L, ul = 9446700000000000000L;
uint64_t um = 9100000000000000000L, un = 9446700000000000000L;
uint16_t uz=0;  
uint32_t uy=0;
uint64_t uv=0, uw=0, ux=0;
uint128_t uu=0, ut=0;
            PRSV();
    // LLVM 3.2 misra-C-2-1-ui-wc-wm2.c:71:61: error: use of undeclared identifier 'INT_MIN'
    printf("INT_MIN   = %d,     INT_MAX = %d UINT_MAX  = %u\n", INT_MIN, INT_MAX, UINT_MAX);
    printf("LONG_MIN   = %d,     LONG_MAX = %d ULONG_MAX  = %u\n", LONG_MIN, LONG_MAX, ULONG_MAX);
    printf("LLONG_MIN   = %20d,     LLONG_MAX = %20d ULLONG_MAX  = %20u\n", INT_MIN, INT_MAX, UINT_MAX);
    // uint8_t -> uint16_t;
    printf("integer promotion: 8bit\n");
    PRT(u,lu, ua, ub, uz, uint16_t);
    // uint16_t -> uint32_t 
    printf("16bit\n");
PRT(u,lu, uc, ud, uy, uint32_t);
// uint32_t -> uint64_t 
PRT(lu,llu, ue, uf, ux, uint64_t);
    //  cast
    printf("cast: 32bit\n");
PRT(lu,llu, ug, uh, uw, uint64_t);
    // overflow
    printf("truncation\n");
PRT(lu,llu, ui, uj, uv, uint64_t);
    // uint128
    printf("if any 64bit \n");
PRT(lu,llu, uk, ul,uu, uint128_t);

//printf("%" "u" " + %" "u" "= %" "u" ", %" "lu" "\n", ua, ub, ua + ub, uz); uz = ua + ub;printf("%" "u" " + %" "u" "= %" "u" ", %" "lu" "\n", ua, ub, ua + ub, uz); uz = (uint32_t) ua + ub;printf("%" "u"" + %" "u" " = %" "u" ", %" "lu" "\n", ua, ub, (uint32_t) ua + ub, uz);
//printf("%" "u" " + %" "u" "= %" "u" ", %" "lu" "\n", uc, ud, uc + ud, uy); uy = uc + ud;printf("%" "u" " + %" "u" "= %" "u" ", %" "lu" "\n", uc, ud, uc + ud, uy); uy = (uint32_t) uc + ud;printf("%" "u"" + %" "u" " = %" "u" ", %" "lu" "\n", uc, ud, (uint32_t) uc + ud, uy);
//printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "lu" "\n", ue, uf, ue + uf, ux); ux = ue + uf;printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "lu" "\n", ue, uf, ue + uf, ux); ux = (uint64_t) ue + uf;printf("%" "lu"" + %" "lu" " = %" "lu" ", %" "lu" "\n", ue, uf, (uint64_t) ue + uf, ux);
//printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "lu" "\n", ug, uh, ug + uh, uw); uw = ug + uh;printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "lu" "\n", ug, uh, ug + uh, uw); uw = (uint64_t) ug + uh;printf("%" "lu"" + %" "lu" " = %" "lu" ", %" "lu" "\n", ug, uh, (uint64_t) ug + uh, uw);
//printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "lu" "\n", ui, uj, ui + uj, uw); uw = ui + uj;printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "lu" "\n", ui, uj, ui + uj, uw); uw = (uint64_t) ui + uj;printf("%" "lu"" + %" "lu" " = %" "lu" ", %" "lu" "\n", ui, uj, (uint64_t) ui + uj, uw);
//printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "llu" "\n", uk, ul, uk + ul, uv); uv = uk + ul;printf("%" "lu" " + %" "lu" "= %" "lu" ", %" "llu" "\n", uk, ul, uk + ul, uv); uv = (uint128_t) uk + ul;printf("%" "lu"" + %" "lu" " = %" "lu" ", %" "llu" "\n", uk, ul, (uint128_t) uk + ul, uv);
PRT(lu,llu, um, un,ut, uint128_t);
printf("MISRA C.2.1 Type widening in integer promotion\n");
}
// 1, warning
// 1.1 LLVM 3.2
//misra-C-2-1-ui-wc-wm.c:64:33: warning: implicit conversion from 'long' to 'uint32_t' (aka 'unsigned int') changes value from 5000000000 to 705032704 [-Wconstant-conversion]
// uint32_t uh = 4000000000, ui = 5000000000;
//                           ~~   ^~~~~~~~~~
// 1.2 GCC 4.9
//misra-C-2-1-ui-wc-wm.c:61:2: warning: large integer implicitly truncated to unsigned type [-Woverflow]
// uint32_t uh = 4000000000, ui = 5000000000;
//  ^
// 1.3 warning VC/C++ 2013
// c:\misra-c-c-2.1.cpp(128): warning C4305: 
// c:\misra-c-c-2.1.cpp(128): warning C4309: '
//
// 1.4 warning NC30W
//
// 2, output LLVM & GCC4.9
//no ISO/IEC 9899,32bit
//INT_MIN   = -2147483648,     INT_MAX = 2147483647 UINT_MAX  = 4294967295
//LONG_MIN   = 0,     LONG_MAX = -1 ULONG_MAX  = 4294967295
//LLONG_MIN   =          -2147483648,     LLONG_MAX =           2147483647 ULLONG_MAX  =           4294967295
//integer promotion: 8bit
//200 + 200= 400, 0
//200 + 200= 400, 400
//200 + 200 = 400, 400
//16bit
//40000 + 30000= 70000, 0
//40000 + 30000= 70000, 70000
//40000 + 30000 = 70000, 70000
//2000000000 + 2000000000= 4000000000, 0
//2000000000 + 2000000000= 4000000000, 4000000000
//2000000000 + 2000000000 = 4000000000, 4000000000
//cast: 32bit
//2000000000 + 3000000000= 705032704, 0
//2000000000 + 3000000000= 705032704, 705032704
//2000000000 + 3000000000 = 5000000000, 5000000000
//truncation
//4000000000 + 705032704= 410065408, 0
//4000000000 + 705032704= 410065408, 410065408
//4000000000 + 705032704 = 4705032704, 4705032704
//if any 64bit 
//9000000000000000000 + 9446700000000000000= 18446700000000000000, 0
//9000000000000000000 + 9446700000000000000= 18446700000000000000, 18446700000000000000
//9000000000000000000 + 9446700000000000000 = 18446700000000000000, 18446700000000000000
//9100000000000000000 + 9446700000000000000= 99955926290448384, 0
//9100000000000000000 + 9446700000000000000= 99955926290448384, 99955926290448384
//9100000000000000000 + 9446700000000000000 = 99955926290448384, 99955926290448384
//MISRA C.2.1 Type widening in integer promotion
//
// 2.2 vc/c++ 2013
// 2.3 NC30W 
//MISRA C.2.1 Type widening in integer promotion
//INT_MIN = -32768, INT_MAX = 32767 UINT_MAX = 65535
//LONG_MIN = -2147483648, LONG_MAX = 2147483647 ULONG_MAX = 4294967295
//LLONG_MIN = -9223372036854775808, LLONG_MAX = 9223372036854775807 ULLONG_MAX = 18446744073709551615
// 200+200=144
// 200+200=400
// 4000 + 3000 =  4464
// 4000 + 3000 =  70000
// 2000000000+ 2000000000 = 4000000000
// 2000000000+ 2000000000 = 4000000000
// 2000000000+ 3000000000 = 705032704
// 2000000000+ 3000000000  =5000000000
// 4000000000 +705032704  =  410065408
// 4000000000 +705032704  =4705032704
//  9000000000000000000 +9446700000000000000  =  18446700000000000000
// 90000000000000000000 +9446700000000000000  =  18446700000000000000
// 91000000000000000000 +9446700000000000000 =      99955926290448384
// 91000000000000000000 +9446700000000000000 =      99955926290448384

MISRA 用自作ヘッダファイルは

misra_c.h
//--- misra_c.h
// Author, (c) ogawa.kiyoshi, January 7, 2014 
//          @kaizen_nagoya, researchmap.jp/kaizen/MISRA-C/
// Purpose: macro, definition and/or information to Compile Examples.
#ifndef __MISRA_C__
#define __MISRA_C__
#endif

#ifndef  __STANDARD_IO__  // without renesas NC30W
#define __ISO_IEC_9899_1999__
#define __int32bit__
#else // for renesas NC30W only
#define __ISO_IEC_9899_1990__
#define __int16bit__
#endif //__STANDARD_IO__

#ifdef __ISO_IEC_9899_2011__
#include <stdarg.h>
#include <stdint.h> 
#define PRSV() printf("ISO/IEC 9899:2011\n")
#elseif __ISO_IEC_9899_1999__
#include <stdarg.h>
#include <stdint.h> 
#define PRSV() printf("ISO/IEC 9899:1999"\n)
#elseif __ISO_IEC_9899_1990__
// #include <stdint.h> //nc30wa is not supported
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long  uint64_t;
typedef unsigned long  uint128_t;
// macro using printf debug or not.
#define PRSV() printf("ISO/IEC 9899:1990\n")
#elseif __int16bit__
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
typedef unsigned long uint64_t;
typedef unsigned long  uint128_t;
#define PRSV() printf("no ISO/IEC 9899,16bit\n")
#else
#include <stdarg.h>
#include <stdint.h> 
typedef unsigned long long uint128_t;
#define PRSV() printf("no ISO/IEC 9899,32bit\n")
#endif

////////////// for each example
#ifdef __MISRA_C_C_2_1_
#ifndef  __STANDARD_IO__  // without renesas NC30W
#define PR(a,b,c,d,e)  printf("%" #a " + %" #a "= %" #a ", %" #b "\n", c, d, c + d, e)
#define PRC(a,b,c,d,e,f) printf("%" #a" + %" #a " = %" #a ", %" #b "\n", c, d, (f) c + d, e)
#define PRT(a,b,c,d,e,f) PR(a,b, c, d, e); e = c + d;PR(a,b, c, d, e); e = (f) c + d;/*printf(" " #e" =%llu ",e);*/PRC(a,a,c,d,e,f);PRC(a,b,c,d,e,f)
#else // for renesas NC30W only
#define PR(a,b,c,d,e)
#define PRC(a,b,c,d,e,f) 
#endif //__STANDARD_IO__
#endif //__MISRA_C_C_2_1_

//--- stdafx.h not for windows and visual C/C++
// Author, (c) ogawa.kiyoshi, January 7, 2014 
//          @kaizen_nagoya, researchmap.jp/kaizen/MISRA-C/
// Purpose: stdafx.h
#ifndef __stdafx_h__
#define __stdafx_h__
// Note: This is not for MS windows & Visual C/C++
//          http://social.msdn.microsoft.com/Forums/vstudio/en-US/88339ac0-678d-41d7-a421-519462087277/visual-studio-2008-wont-find-ifdef-win32?forum=vcgenera
#include <stdio.h>
#ifndef _WIN32
#define _NO_WIN32
#else
#error please use MS original stdafx.h
#endif 
#endif

関連文献

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C.2.1 Type widening in integer promotion,(wicm3.c )
https://qiita.com/kaizen_nagoya/items/6a24db5d51efae358cfb

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?