Overload Journal

Total Page:16

File Type:pdf, Size:1020Kb

Overload Journal A ower Language Nee s Power Tools Smart editor Reliable with full language support refactorings Support for C++03/C++ll, Rename, Extract Function -:(r):- Boost andlibc++,C++ 7 Constant/ Variable, templates and macros. Change8ignature, & more Code generation Profound and navigation code analysis Generate menu, On-the-f y, analysis Find context usages, with Gluick-fixes& dozens 0 Go to Symbol, and more ofsmart checks GET A C++ DEVELOPMENT,:rOOL THAT YOU DESERV ReSharper C++ AppCode CLion Visual Studio Extension IDE for iOS Cross-platform IDE for C•• developers and OS X development for C and C•• developers Start a free 30-day trial jb.gg/cpp-accu Find out more at www.qbssoftware.com QBS SOFTWARE OVERLOAD CONTENTS OVERLOAD 160 December 2020 Overload is a publication of the ACCU ISSN 1354-3172 For details of the ACCU, our publications Editor and activities, visit the ACCU website: Frances Buontempo [email protected] www.accu.org Advisors Ben Curry [email protected] Mikael Kilpeläinen [email protected] 4 Questions on the Form of Software Steve Love Lucian Radu Teodorescu considers whether the [email protected] difficulties in writing software are rooted in the Chris Oldwood essence of development. [email protected] Roger Orr 8 Building g++ from the [email protected] Balog Pal GCC Modules Branch [email protected] Roger Orr demonstrates how to get a compiler that Tor Arve Stangeland supports modules up and running. [email protected] Anthony Williams 10 Consuming the uk-covid19 API [email protected] Donald Hernik demonstrates how to wrangle data Advertising enquiries out of the UK API. [email protected] 13 What is the Strict Aliasing Rule and Why Printing and distribution Do We Care? Parchment (Oxford) Ltd Strict aliasing is explained. Cover art and design 20 Afterwood Pete Goodliffe Chris Oldwood explains why he thinks Design [email protected] Patterns are still relevant. Copy deadlines All articles intended for publication in Overload 161 should be submitted by 1st January 2021 and those for Overload 162 by 1st March 2021. The ACCU Copyrights and Trade Marks The ACCU is an organisation of Some articles and other contributions use terms that are either registered trade marks or claimed programmers who care about as such. The use of such terms is not intended to support nor disparage any trade mark claim. professionalism in programming. That is, On request we will withdraw all references to a specific trade mark and its owner. we care about writing good code, and By default, the copyright of all material published by ACCU is the exclusive property of the author. about writing it in a good way. We are By submitting material to ACCU for publication, an author is, by default, assumed to have granted dedicated to raising the standard of ACCU the right to publish and republish that material in any medium as they see fit. An author programming. of an article or column (not a letter or a review of software or a book) may explicitly offer single The articles in this magazine have all (first serial) publication rights and thereby retain all other rights. been written by ACCU members - by Except for licences granted to 1) Corporate Members to copy solely for internal distribution 2) programmers, for programmers - and members to copy source code for use on their own computers, no material can be copied from have been contributed free of charge. Overload without written permission from the copyright holder. December 2020 | Overload | 1 EDITORIAL FRANCES BUONTEMPO Debt – My First Thirty Years Reflecting on code often reveals gnarliness. Frances Buontempo reminds herself about all the tech debt she’s ever caused. I still owe our readers an editorial, and know I have cutting corners. Computer graphics also cut corners, tending to rely on accumulated a huge debt over the last several years. representations made from a mesh of triangles, going in straight lines Fortunately, you don’t seem to be charging me rather than curves. This also means you can do the mathematics once for interest, so there is hope. As soon as you charge several vertices and speed things up [Wikipedia-2]. Cutting corners can interest on a debt, it is possible for the debt to keep be a good thing or a bad thing; it depends. growing and become impossible to pay back. In contrast, cutting the mustard is always good. When mustard was grown Charging interest, or at least excessive interest, is sometimes referred to as a main crop, it “was cut by hand with scythes, in the same way as corn. as usury. Anyone taking advantage like this is sometimes called a loan The crop could grow up to six feet high and this was very arduous work, shark. By lending money to someone who is desperate, needing food or requiring extremely sharp tools. When blunt they ‘would not cut the a way to pay rent, or similar, and then threatening them with violence if mustard’” [Guardian]. Maybe tech debt is like blunt tools? By leaving they don’t repay causes debt, and despair, to spiral out of control. Not a behind software that’s hard to use or difficult to understand or change good place to be. you’ve made life difficult. Even a skilled coder won’t be able to be very What’s this got to do with programming, you may ask? Almost nothing, effective if armed with a blunt scythe. in one sense. And yet, tech debt is a term that gets banded around, so Describing a dangerous or confusing system as debt seems odd. We perhaps it’s got everything to do with programming. Why do we describe decided to get some new lighting in our house and the electrician ran a confusing, hard to maintain code as debt? We haven’t borrowed money safety test first. We were half expecting a can of worms, or some kind of to cover it, so can’t be charged interest. We may have cut a corner or two, spaghetti wiring situation. Hooray for a way to test things before touching in order to get something out the door quickly, leaving a problem to deal anything live. I am pleased to report the house doesn’t need re-wiring and with later. I say later, but it often turns out to be sooner. With untested the electrician’s insulated snips worked but we need to have some ‘tech edge cases, things may blow up regularly. Without useful logging, you debt’ fixed before it is safe to get new lights installed. Without going into can’t figure out what happened. If the so-called quick win, cut corner, or too many details, let’s say words like ‘Why would anyone do this?’ and tech debt, means people have to down tools and fix things on a regular ‘That’s very confusing!’ and ‘Why would anyone connect the earth wire basis, you have in fact slowed everything down. Cutting corners is very to live?’ were banded about. Similar statements can end up as tech debt different to being in debt. Such short cuts are more like being in danger. Jiras, and the engineers being told the customer’s priority is new lights, so I recently described cutting corners as being like a Koch snowflake these debt tickets will have to wait until later. As a customer, I want it to [Wikipedia-1]. Now, to build this ‘snowflake’, you start with a triangle and be safe to change a light bulb, so please fix the dangerous stuff first. Just cut out the middle of each side replacing it with a smaller triangle, and saying. Letting engineers talk directly to customers is often the best way. continue ad infinitum. This, in some sense, is the opposite of cutting There are conventions for which coloured wire connects where for reasons: corners, since you add more corners each time, and tend towards to make the wiring safe for people to change, replace and extend in the something 8/5 times the original area. Cutting corners in code does often future without a huge wiring diagram and user manual. Describing cutting involve slapping extra bits in, copying and pasting code, wedging in a few corners and brazenly ignoring conventions as tech debt seems to miss the booleans and if/else code paths and the like. Such short cuts are more point somewhat. Conventions and protocols often exist to keep us safe. like spare parts gaffer-taped on. Now, cutting corners comes from the idea Now, not all coders regard themselves as engineers, and in fact some code of trespassing across a farmer’s field, or driving on the wrong side of the isn’t written for customers. Many of us have personal projects, and some road at a bend, rather than sticking to the legal route. You could suggest of us might be regarded as hobbyist programmers. I have frequently illegal practices aren’t necessarily wrong and there are some perfectly sketched out a few lines of code in a new language I’m learning, knowing legal cases where cutting corners makes life easier. If you smoke roll-ups, full well it’s an untidy mess, or just for trying things out, like rough notes. cigarette papers with the corners cut are much easier to roll – letting you I am a beginner so haven’t discovered or understood the conventions tuck the paper in more easily. Or more seasonally, wrapping presents is initially. Does that count as being tech debt? When I first started learning something of an art form. I recall my Father telling me once about some Python, I sketched out lines of code in the repl, and became frustrated at way to calculate the smallest amount of wrapping paper needed, and having to type them all over again when I revisited my noodling.
Recommended publications
  • Exploring C Semantics and Pointer Provenance
    Exploring C Semantics and Pointer Provenance KAYVAN MEMARIAN, University of Cambridge VICTOR B. F. GOMES, University of Cambridge BROOKS DAVIS, SRI International STEPHEN KELL, University of Cambridge ALEXANDER RICHARDSON, University of Cambridge ROBERT N. M. WATSON, University of Cambridge PETER SEWELL, University of Cambridge The semantics of pointers and memory objects in C has been a vexed question for many years. C values cannot be treated as either purely abstract or purely concrete entities: the language exposes their representations, 67 but compiler optimisations rely on analyses that reason about provenance and initialisation status, not just runtime representations. The ISO WG14 standard leaves much of this unclear, and in some respects differs with de facto standard usage — which itself is difficult to investigate. In this paper we explore the possible source-language semantics for memory objects and pointers, in ISO C and in C as it is used and implemented in practice, focussing especially on pointer provenance. We aim to, as far as possible, reconcile the ISO C standard, mainstream compiler behaviour, and the semantics relied on by the corpus of existing C code. We present two coherent proposals, tracking provenance via integers and not; both address many design questions. We highlight some pros and cons and open questions, and illustrate the discussion with a library of test cases. We make our semantics executable as a test oracle, integrating it with the Cerberus semantics for much of the rest of C, which we have made substantially more complete and robust, and equipped with a web-interface GUI. This allows us to experimentally assess our proposals on those test cases.
    [Show full text]
  • Diabetes Care Diagnostics Diagnostics Diagnostics (RDC) (RPD) (RMD) (RTD)
    Committed to innovation and growth Roland Diggelmann, COO Roche Diagnostics UBS Best of Switzerland, Wolfsberg September 19, 2013 HY 2013 Group Results Diagnostics Overview & Strategy HY 2013 Companion Diagnostics Outlook HY 2013: Roche Group highlights HY 2013 performance • Strong Pharma performance, driven by US; solid growth for Diagnostics • 12% core EPS growth1, driven largely by strong underlying business • Solid operating free cash flow (+4%1) Innovation • Move into phase III: Bcl2 inhibitor and anti-PDL1 • Data read-outs for potential phase III decisions: etrolizumab and anti-factor D • Positive CHMP recommendation for Herceptin SC • Discontinued: aleglitazar and GA201 3 1 CER=Constant Exchange Rates HY 2013: Strong sales momentum continues HY 2013 HY 2012 Change in % CHF bn CHF bn CHF CER Pharmaceuticals Division 18.2 17.4 4 6 Diagnostics Division 5.1 5.0 2 3 Roche Group 23.3 22.4 4 5 4 CER=Constant Exchange Rates HY 2013 Group Results Diagnostics Overview & Strategy HY 2013 Companion Diagnostics Outlook In-Vitro Diagnostics market overview Large and growing market; Roche is market leader Market share Market size USD 50 bn Roche Professional Diagnostics 20% Others 39% Molecular Diagnostics 11% Abbott Tissue Diagnostics 10% 3% Siemens Diabetes Monitoring Biomerieux 8% 8% Danaher J&J 6 Source: Roche Analysis, Company reports for 2012 validated by an independent IVD consultancy Overview of Roche Diagnostics New reporting structure In Vitro Diagnostics & Life Sciences Professional Molecular Tissue Diabetes Care Diagnostics Diagnostics
    [Show full text]
  • Timur Doumler @Timur Audio
    Type punning in modern C++ version 1.1 Timur Doumler @timur_audio C++ Russia 30 October 2019 Image: ESA/Hubble Type punning in modern C++ 2 How not to do type punning in modern C++ 3 How to write portable code that achieves the same effect as type punning in modern C++ 4 How to write portable code that achieves the same effect as type punning in modern C++ without causing undefined behaviour 5 6 7 � 8 � (�) 9 10 11 12 struct Widget { virtual void doSomething() { printf("Widget"); } }; struct Gizmo { virtual void doSomethingCompletelyDifferent() { printf("Gizmo"); } }; int main() { Gizmo g; Widget* w = (Widget*)&g; w->doSomething(); } Example from Luna @lunasorcery 13 struct Widget { virtual void doSomething() { printf("Widget"); } }; struct Gizmo { virtual void doSomethingCompletelyDifferent() { printf("Gizmo"); } }; int main() { Gizmo g; Widget* w = (Widget*)&g; w->doSomething(); } Example from Luna @lunasorcery 14 15 Don’t use C-style casts. 16 struct Widget { virtual void doSomething() { printf("Widget"); } }; struct Gizmo { virtual void doSomethingCompletelyDifferent() { printf("Gizmo"); } }; int main() { Gizmo g; Widget* w = (Widget*)&g; w->doSomething(); } Example from Luna @lunasorcery 17 18 19 20 float F0 00 80 01 int F0 00 80 01 21 float F0 00 80 01 int F0 00 80 01 float F0 00 80 01 char* std::byte* F0 00 80 01 22 float F0 00 80 01 int F0 00 80 01 float F0 00 80 01 char* std::byte* F0 00 80 01 Widget F0 00 80 01 01 BD 83 E3 float[2] F0 00 80 01 01 BD 83 E3 23 float F0 00 80 01 int F0 00 80 01 float F0 00 80 01 char* std::byte*
    [Show full text]
  • Effective Types: Examples (P1796R0) 2 3 4 PETER SEWELL, University of Cambridge 5 KAYVAN MEMARIAN, University of Cambridge 6 VICTOR B
    1 Effective types: examples (P1796R0) 2 3 4 PETER SEWELL, University of Cambridge 5 KAYVAN MEMARIAN, University of Cambridge 6 VICTOR B. F. GOMES, University of Cambridge 7 JENS GUSTEDT, INRIA 8 HUBERT TONG 9 10 11 This is a collection of examples exploring the semantics that should be allowed for objects 12 and subobjects in allocated regions – especially, where the defined/undefined-behaviour 13 boundary should be, and how that relates to compiler alias analysis. The examples are in 14 C, but much should be similar in C++. We refer to the ISO C notion of effective types, 15 but that turns out to be quite flawed. Some examples at the end (from Hubert Tong) show 16 that existing compiler behaviour is not consistent with type-changing updates. 17 This is an updated version of part of n2294 C Memory Object Model Study Group: 18 Progress Report, 2018-09-16. 19 1 INTRODUCTION 20 21 Paragraphs 6.5p{6,7} of the standard introduce effective types. These were added to 22 C in C99 to permit compilers to do optimisations driven by type-based alias analysis, 23 by ruling out programs involving unannotated aliasing of references to different types 24 (regarding them as having undefined behaviour). However, this is one of the less clear, 25 less well-understood, and more controversial aspects of the standard, as one can see from 1 2 26 various GCC and Linux Kernel mailing list threads , blog postings , and the responses to 3 4 27 Questions 10, 11, and 15 of our survey . See also earlier committee discussion .
    [Show full text]
  • Aliasing Restrictions of C11 Formalized in Coq
    Aliasing restrictions of C11 formalized in Coq Robbert Krebbers Radboud University Nijmegen December 11, 2013 @ CPP, Melbourne, Australia int f(int *p, int *q) { int x = *p; *q = 314; return x; } If p and q alias, the original value n of *p is returned n p q Optimizing x away is unsound: 314 would be returned Alias analysis: to determine whether pointers can alias Aliasing Aliasing: multiple pointers referring to the same object Optimizing x away is unsound: 314 would be returned Alias analysis: to determine whether pointers can alias Aliasing Aliasing: multiple pointers referring to the same object int f(int *p, int *q) { int x = *p; *q = 314; return x; } If p and q alias, the original value n of *p is returned n p q Alias analysis: to determine whether pointers can alias Aliasing Aliasing: multiple pointers referring to the same object int f(int *p, int *q) { int x = *p; *q = 314; return x *p; } If p and q alias, the original value n of *p is returned n p q Optimizing x away is unsound: 314 would be returned Aliasing Aliasing: multiple pointers referring to the same object int f(int *p, int *q) { int x = *p; *q = 314; return x; } If p and q alias, the original value n of *p is returned n p q Optimizing x away is unsound: 314 would be returned Alias analysis: to determine whether pointers can alias It can still be called with aliased pointers: x union { int x; float y; } u; y u.x = 271; return h(&u.x, &u.y); &u.x &u.y C89 allows p and q to be aliased, and thus requires it to return 271 C99/C11 allows type-based alias analysis: I A compiler
    [Show full text]
  • SATE V Ockham Sound Analysis Criteria
    NISTIR 8113 SATE V Ockham Sound Analysis Criteria Paul E. Black Athos Ribeiro This publication is available free of charge from: https://doi.org/10.6028/NIST.IR.8113 NISTIR 8113 SATE V Ockham Sound Analysis Criteria Paul E. Black Software and Systems Division Information Technology Laboratory Athos Ribeiro Department of Computer Science University of Sao˜ Paulo Sao˜ Paulo, SP Brazil This publication is available free of charge from: https://doi.org/10.6028/NIST.IR.8113 March 2016 Including updates as of June 2017 U.S. Department of Commerce Wilbur L. Ross, Jr., Secretary National Institute of Standards and Technology Kent Rochford, Acting NIST Director and Under Secretary of Commerce for Standards and Technology Abstract Static analyzers examine the source or executable code of programs to find problems. Many static analyzers use heuristics or approximations to handle programs up to millions of lines of code. We established the Ockham Sound Analysis Criteria to recognize static analyzers whose findings are always correct. In brief the criteria are (1) the analyzer’s findings are claimed to always be correct, (2) it produces findings for most of a program, and (3) even one incorrect finding disqualifies an analyzer. This document begins by explaining the background and requirements of the Ockham Criteria. In Static Analysis Tool Exposition (SATE) V, only one tool was submitted to be re- viewed. Pascal Cuoq and Florent Kirchner ran the August 2013 development version of Frama-C on pertinent parts of the Juliet 1.2 test suite. We divided the warnings into eight classes, including improper buffer access, NULL pointer dereference, integer overflow, and use of uninitialized variable.
    [Show full text]
  • Notes on Functional Programming with Haskell
    Notes on Functional Programming with Haskell H. Conrad Cunningham [email protected] Multiparadigm Software Architecture Group Department of Computer and Information Science University of Mississippi 201 Weir Hall University, Mississippi 38677 USA Fall Semester 2014 Copyright c 1994, 1995, 1997, 2003, 2007, 2010, 2014 by H. Conrad Cunningham Permission to copy and use this document for educational or research purposes of a non-commercial nature is hereby granted provided that this copyright notice is retained on all copies. All other rights are reserved by the author. H. Conrad Cunningham, D.Sc. Professor and Chair Department of Computer and Information Science University of Mississippi 201 Weir Hall University, Mississippi 38677 USA [email protected] PREFACE TO 1995 EDITION I wrote this set of lecture notes for use in the course Functional Programming (CSCI 555) that I teach in the Department of Computer and Information Science at the Uni- versity of Mississippi. The course is open to advanced undergraduates and beginning graduate students. The first version of these notes were written as a part of my preparation for the fall semester 1993 offering of the course. This version reflects some restructuring and revision done for the fall 1994 offering of the course|or after completion of the class. For these classes, I used the following resources: Textbook { Richard Bird and Philip Wadler. Introduction to Functional Program- ming, Prentice Hall International, 1988 [2]. These notes more or less cover the material from chapters 1 through 6 plus selected material from chapters 7 through 9. Software { Gofer interpreter version 2.30 (2.28 in 1993) written by Mark P.
    [Show full text]
  • 2.19 Historical Perspective and Further Reading 2.19
    2.19 Historical Perspective and Further Reading 2.19 This section surveys the history of instruction set architraves over time, and we give a short history of programming languages and compilers. ISAs include accu- mulator architectures, general-purpose register architectures, stack architectures, and a brief history of the IA-32. We also review the controversial subjects of high- level-language computer architectures and reduced instruction set computer architectures. The history of programming languages includes Fortran, Lisp, Algol, C, Cobol, Pascal, Simula, Smalltalk, C++, and Java, and the history of com- pilers includes the key milestones and the pioneers who achieved them. Accumulator Architectures accumulator:Archaic term for register. On-line use of it Hardware was precious in the earliest stored-program computers. Consequently, as a synonym for “register” is computer pioneers could not afford the number of registers found in today’s a fairly reliable indication machines. In fact, these machines had a single register for arithmetic instructions. that the user has been Since all operations would accumulate in a single register, it was called the accu- around quite a while. mulator, and this style of instruction set is given the same name. For example, EDSAC in 1949 had a single accumulator. Eric Raymond, The New The three-operand format of MIPS suggests that a single register is at least two Hacker’s Dictionary, 1991 registers shy of our needs. Having the accumulator as both a source operand and as the destination of the operation fills part of the shortfall, but it still leaves us one operand short. That final operand is found in memory.
    [Show full text]
  • Half-Precision Floating-Point Formats for Pagerank: Opportunities and Challenges
    Half-Precision Floating-Point Formats for PageRank: Opportunities and Challenges Molahosseini, A. S., & Vandierendonck, H. (2020). Half-Precision Floating-Point Formats for PageRank: Opportunities and Challenges. In 2020 IEEE High Performance Extreme Computing Conference, HPEC 2020 [9286179] (IEEE High Performance Extreme Computing Conference: Proceedings). Institute of Electrical and Electronics Engineers Inc.. https://doi.org/10.1109/HPEC43674.2020.9286179 Published in: 2020 IEEE High Performance Extreme Computing Conference, HPEC 2020 Document Version: Peer reviewed version Queen's University Belfast - Research Portal: Link to publication record in Queen's University Belfast Research Portal Publisher rights Copyright 2020 IEEE. This work is made available online in accordance with the publisher’s policies. Please refer to any applicable terms of use of the publisher. General rights Copyright for the publications made accessible via the Queen's University Belfast Research Portal is retained by the author(s) and / or other copyright owners and it is a condition of accessing these publications that users recognise and abide by the legal requirements associated with these rights. Take down policy The Research Portal is Queen's institutional repository that provides access to Queen's research output. Every effort has been made to ensure that content in the Research Portal does not infringe any person's rights, or applicable UK laws. If you discover content in the Research Portal that you believe breaches copyright or violates any law, please
    [Show full text]
  • A Formal C Memory Model for Separation Logic
    Journal of Automated Reasoning manuscript No. (will be inserted by the editor) A Formal C Memory Model for Separation Logic Robbert Krebbers Received: n/a Abstract The core of a formal semantics of an imperative programming language is a memory model that describes the behavior of operations on the memory. Defining a memory model that matches the description of C in the C11 standard is challenging because C allows both high-level (by means of typed expressions) and low-level (by means of bit manipulation) memory accesses. The C11 standard has restricted the interaction between these two levels to make more effective compiler optimizations possible, at the expense of making the memory model complicated. We describe a formal memory model of the (non-concurrent part of the) C11 stan- dard that incorporates these restrictions, and at the same time describes low-level memory operations. This formal memory model includes a rich permission model to make it usable in separation logic and supports reasoning about program transfor- mations. The memory model and essential properties of it have been fully formalized using the Coq proof assistant. Keywords ISO C11 Standard · C Verification · Memory Models · Separation Logic · Interactive Theorem Proving · Coq 1 Introduction A memory model is the core of a semantics of an imperative programming language. It models the memory states and describes the behavior of memory operations. The main operations described by a C memory model are: – Reading a value at a given address. – Storing a value at a given address. – Allocating a new object to hold a local variable or storage obtained via malloc.
    [Show full text]
  • Low−Level C Topic for CS2263 Alumni −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− People Who Have Taken CS2617 Should Instead Read the Full Set of Notes (Cnotes)
    Low−level C Topic for CS2263 Alumni −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− People who have taken CS2617 should instead read the full set of notes (cnotes). Note: 2nd ed of textbook was for C−89 (classic "ANSI−C". Third is based on the 2018 revision. There were many changes in 30 years. C−11 and C−99 are also in widespread use. A new version (currently called C−2X) is expected in 2021 or 2022. Change look fairly small (new "decimal floats", if you care.) The Preprocessor −−−−−−−−−−−−−−−− Unlike Java, the C compiler has a "preprocessor" that does textual substitutions and "conditional compilation" before the "real compiler" runs. This was borrowed from assembly languages. Fancy uses of preprocessor are often deprecated, especially since C99. Still commonly used use for defining constants and in doing the C equivalent to Java’s "import". Preprocessor "directives" start with #. No ’;’ at end Macros in the C Preprocessor −−−−−−−−−−−−−−−−−−−−−−−−−−−−− #define FOO 12*2 thereafter, wherever the symbol FOO occurs in your code, it is textually replaced by 12*2 . Think find−and−replace. Macro can have parameters #define BAR(x) 12*x If we have BAR(3*z) in your code, it is textually replaced by 12*3*z #undef BAR will "undefine" BAR. After this, BAR(3*z) remains as is. Perils of Macros −−−−−−−−−−−−−−−−− #define SQUARE(x) ((x)*(x)) used much later with int x = 0; int y = SQUARE(x++); What value for x is expected by a programmer looking only at these lines? What value does x actually have? Making Strings and Concatenating Tokens −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− (optional fancy topic) In a macro definition, the # operator puts quote marks around a macro argument.
    [Show full text]
  • Exploring C Semantics and Pointer Provenance
    Exploring C Semantics and Pointer Provenance KAYVAN MEMARIAN, University of Cambridge, UK VICTOR B. F. GOMES, University of Cambridge, UK BROOKS DAVIS, SRI International, USA STEPHEN KELL, University of Cambridge, UK ALEXANDER RICHARDSON, University of Cambridge, UK ROBERT N. M. WATSON, University of Cambridge, UK PETER SEWELL, University of Cambridge, UK The semantics of pointers and memory objects in C has been a vexed question for many years. C values cannot be treated as either purely abstract or purely concrete entities: the language exposes their representations, 67 but compiler optimisations rely on analyses that reason about provenance and initialisation status, not just runtime representations. The ISO WG14 standard leaves much of this unclear, and in some respects differs with de facto standard usage — which itself is difficult to investigate. In this paper we explore the possible source-language semantics for memory objects and pointers, in ISO C and in C as it is used and implemented in practice, focussing especially on pointer provenance. We aim to, as far as possible, reconcile the ISO C standard, mainstream compiler behaviour, and the semantics relied on by the corpus of existing C code. We present two coherent proposals, tracking provenance via integers and not; both address many design questions. We highlight some pros and cons and open questions, and illustrate the discussion with a library of test cases. We make our semantics executable as a test oracle, integrating it with the Cerberus semantics for much of the rest of C, which we have made substantially more complete and robust, and equipped with a web-interface GUI.
    [Show full text]