Share to: share facebook share twitter share wa share telegram print page

Assertion (software development)

In computer programming, specifically when using the imperative programming paradigm, an assertion is a predicate (a Boolean-valued function over the state space, usually expressed as a logical proposition using the variables of a program) connected to a point in the program, that always should evaluate to true at that point in code execution. Assertions can help a programmer read the code, help a compiler compile it, or help the program detect its own defects.

For the latter, some programs check assertions by actually evaluating the predicate as they run. Then, if it is not in fact true – an assertion failure – the program considers itself to be broken and typically deliberately crashes or throws an assertion failure exception.

Details

The following code contains two assertions, x > 0 and x > 1, and they are indeed true at the indicated points during execution:

x = 1;
assert x > 0;
x++;
assert x > 1;

Programmers can use assertions to help specify programs and to reason about program correctness. For example, a precondition—an assertion placed at the beginning of a section of code—determines the set of states under which the programmer expects the code to execute. A postcondition—placed at the end—describes the expected state at the end of execution. For example: x > 0 { x++ } x > 1.

The example above uses the notation for including assertions used by C. A. R. Hoare in his 1969 article.[1] That notation cannot be used in existing mainstream programming languages. However, programmers can include unchecked assertions using the comment feature of their programming language. For example, in C++:

x = 5;
x = x + 1;
// {x > 1}

The braces included in the comment help distinguish this use of a comment from other uses.

Libraries may provide assertion features as well. For example, in C using glibc with C99 support:

#include <assert.h>

int f(void)
{
    int x = 5;
    x = x + 1;
    assert(x > 1);
}

Several modern programming languages include checked assertions – statements that are checked at runtime or sometimes statically. If an assertion evaluates to false at runtime, an assertion failure results, which typically causes execution to abort. This draws attention to the location at which the logical inconsistency is detected and can be preferable to the behaviour that would otherwise result.

The use of assertions helps the programmer design, develop, and reason about a program.

Usage

In languages such as Eiffel, assertions form part of the design process; other languages, such as C and Java, use them only to check assumptions at runtime. In both cases, they can be checked for validity at runtime but can usually also be suppressed.

Assertions in design by contract

Assertions can function as a form of documentation: they can describe the state the code expects to find before it runs (its preconditions), and the state the code expects to result in when it is finished running (postconditions); they can also specify invariants of a class. Eiffel integrates such assertions into the language and automatically extracts them to document the class. This forms an important part of the method of design by contract.

This approach is also useful in languages that do not explicitly support it: the advantage of using assertion statements rather than assertions in comments is that the program can check the assertions every time it runs; if the assertion no longer holds, an error can be reported. This prevents the code from getting out of sync with the assertions.

Assertions for run-time checking

An assertion may be used to verify that an assumption made by the programmer during the implementation of the program remains valid when the program is executed. For example, consider the following Java code:

 int total = countNumberOfUsers();
 if (total % 2 == 0) {
     // total is even
 } else {
     // total is odd and non-negative
     assert total % 2 == 1;
 }

In Java, % is the remainder operator (modulo), and in Java, if its first operand is negative, the result can also be negative (unlike the modulo used in mathematics). Here, the programmer has assumed that total is non-negative, so that the remainder of a division with 2 will always be 0 or 1. The assertion makes this assumption explicit: if countNumberOfUsers does return a negative value, the program may have a bug.

A major advantage of this technique is that when an error does occur it is detected immediately and directly, rather than later through often obscure effects. Since an assertion failure usually reports the code location, one can often pin-point the error without further debugging.

Assertions are also sometimes placed at points the execution is not supposed to reach. For example, assertions could be placed at the default clause of the switch statement in languages such as C, C++, and Java. Any case which the programmer does not handle intentionally will raise an error and the program will abort rather than silently continuing in an erroneous state. In D such an assertion is added automatically when a switch statement doesn't contain a default clause.

In Java, assertions have been a part of the language since version 1.4. Assertion failures result in raising an AssertionError when the program is run with the appropriate flags, without which the assert statements are ignored. In C, they are added on by the standard header assert.h defining assert (assertion) as a macro that signals an error in the case of failure, usually terminating the program. In C++, both assert.h and cassert headers provide the assert macro.

The danger of assertions is that they may cause side effects either by changing memory data or by changing thread timing. Assertions should be implemented carefully so they cause no side effects on program code.

Assertion constructs in a language allow for easy test-driven development (TDD) without the use of a third-party library.

Assertions during the development cycle

During the development cycle, the programmer will typically run the program with assertions enabled. When an assertion failure occurs, the programmer is immediately notified of the problem. Many assertion implementations will also halt the program's execution: this is useful, since if the program continued to run after an assertion violation occurred, it might corrupt its state and make the cause of the problem more difficult to locate. Using the information provided by the assertion failure (such as the location of the failure and perhaps a stack trace, or even the full program state if the environment supports core dumps or if the program is running in a debugger), the programmer can usually fix the problem. Thus assertions provide a very powerful tool in debugging.

Assertions in production environment

When a program is deployed to production, assertions are typically turned off, to avoid any overhead or side effects they may have. In some cases assertions are completely absent from deployed code, such as in C/C++ assertions via macros. In other cases, such as Java, assertions are present in the deployed code, and can be turned on in the field for debugging.[2]

Assertions may also be used to promise the compiler that a given edge condition is not actually reachable, thereby permitting certain optimizations that would not otherwise be possible. In this case, disabling the assertions could actually reduce performance.

Static assertions

Assertions that are checked at compile time are called static assertions.

Static assertions are particularly useful in compile time template metaprogramming, but can also be used in low-level languages like C by introducing illegal code if (and only if) the assertion fails. C11 and C++11 support static assertions directly through static_assert. In earlier C versions, a static assertion can be implemented, for example, like this:

#define SASSERT(pred) switch(0){case 0:case pred:;}

SASSERT( BOOLEAN CONDITION );

If the (BOOLEAN CONDITION) part evaluates to false then the above code will not compile because the compiler will not allow two case labels with the same constant. The boolean expression must be a compile-time constant value, for example (sizeof(int)==4) would be a valid expression in that context. This construct does not work at file scope (i.e. not inside a function), and so it must be wrapped inside a function.

Another popular[3] way of implementing assertions in C is:

static char const static_assertion[ (BOOLEAN CONDITION)
                                    ? 1 : -1
                                  ] = {'!'};

If the (BOOLEAN CONDITION) part evaluates to false then the above code will not compile because arrays may not have a negative length. If in fact the compiler allows a negative length then the initialization byte (the '!' part) should cause even such over-lenient compilers to complain. The boolean expression must be a compile-time constant value, for example (sizeof(int) == 4) would be a valid expression in that context.

Both of these methods require a method of constructing unique names. Modern compilers support a __COUNTER__ preprocessor define that facilitates the construction of unique names, by returning monotonically increasing numbers for each compilation unit.[4]

D provides static assertions through the use of static assert.[5]

Disabling assertions

Most languages allow assertions to be enabled or disabled globally, and sometimes independently. Assertions are often enabled during development and disabled during final testing and on release to the customer. Not checking assertions avoids the cost of evaluating the assertions while (assuming the assertions are free of side effects) still producing the same result under normal conditions. Under abnormal conditions, disabling assertion checking can mean that a program that would have aborted will continue to run. This is sometimes preferable.

Some languages, including C, YASS and C++, can completely remove assertions at compile time using the preprocessor.

Similarly, launching the Python interpreter with "-O" (for "optimize") as an argument will cause the Python code generator to not emit any bytecode for asserts.[6]

Java requires an option to be passed to the run-time engine in order to enable assertions. Absent the option, assertions are bypassed, but they always remain in the code unless optimised away by a JIT compiler at run-time or excluded at compile time via the programmer manually placing each assertion behind an if (false) clause.

Programmers can build checks into their code that are always active by bypassing or manipulating the language's normal assertion-checking mechanisms.

Comparison with error handling

Assertions are distinct from routine error-handling. Assertions document logically impossible situations and discover programming errors: if the impossible occurs, then something fundamental is clearly wrong with the program. This is distinct from error handling: most error conditions are possible, although some may be extremely unlikely to occur in practice. Using assertions as a general-purpose error handling mechanism is unwise: assertions do not allow for recovery from errors; an assertion failure will normally halt the program's execution abruptly; and assertions are often disabled in production code. Assertions also do not display a user-friendly error message.

Consider the following example of using an assertion to handle an error:

  int *ptr = malloc(sizeof(int) * 10);
  assert(ptr);
  // use ptr
  ...

Here, the programmer is aware that malloc will return a NULL pointer if memory is not allocated. This is possible: the operating system does not guarantee that every call to malloc will succeed. If an out of memory error occurs the program will immediately abort. Without the assertion, the program would continue running until ptr was dereferenced, and possibly longer, depending on the specific hardware being used. So long as assertions are not disabled, an immediate exit is assured. But if a graceful failure is desired, the program has to handle the failure. For example, a server may have multiple clients, or may hold resources that will not be released cleanly, or it may have uncommitted changes to write to a datastore. In such cases it is better to fail a single transaction than to abort abruptly.

Another error is to rely on side effects of expressions used as arguments of an assertion. One should always keep in mind that assertions might not be executed at all, since their sole purpose is to verify that a condition which should always be true does in fact hold true. Consequently, if the program is considered to be error-free and released, assertions may be disabled and will no longer be evaluated.

Consider another version of the previous example:

  int *ptr;
  // Statement below fails if malloc() returns NULL,
  // but is not executed at all when compiling with -NDEBUG!
  assert(ptr = malloc(sizeof(int) * 10));
  // use ptr: ptr isn't initialised when compiling with -NDEBUG!
  ...

This might look like a smart way to assign the return value of malloc to ptr and check if it is NULL in one step, but the malloc call and the assignment to ptr is a side effect of evaluating the expression that forms the assert condition. When the NDEBUG parameter is passed to the compiler, as when the program is considered to be error-free and released, the assert() statement is removed, so malloc() isn't called, rendering ptr uninitialised. This could potentially result in a segmentation fault or similar null pointer error much further down the line in program execution, causing bugs that may be sporadic and/or difficult to track down. Programmers sometimes use a similar VERIFY(X) define to alleviate this problem.

Modern compilers may issue a warning when encountering the above code.[7]

History

In 1947 reports by von Neumann and Goldstine[8] on their design for the IAS machine, they described algorithms using an early version of flow charts, in which they included assertions: "It may be true, that whenever C actually reaches a certain point in the flow diagram, one or more bound variables will necessarily possess certain specified values, or possess certain properties, or satisfy certain properties with each other. Furthermore, we may, at such a point, indicate the validity of these limitations. For this reason we will denote each area in which the validity of such limitations is being asserted, by a special box, which we call an assertion box."

The assertional method for proving correctness of programs was advocated by Alan Turing. In a talk "Checking a Large Routine" at Cambridge, June 24, 1949 Turing suggested: "How can one check a large routine in the sense of making sure that it's right? In order that the man who checks may not have too difficult a task, the programmer should make a number of definite assertions which can be checked individually, and from which the correctness of the whole program easily follows".[9]

See also

References

  1. ^ C. A. R. Hoare, An axiomatic basis for computer programming, Communications of the ACM, 1969.
  2. ^ Programming With Assertions, Enabling and Disabling Assertions
  3. ^ Jon Jagger, Compile Time Assertions in C, 1999.
  4. ^ GNU, "GCC 4.3 Release Series — Changes, New Features, and Fixes"
  5. ^ "Static Assertions". D Language Reference. The D Language Foundation. Retrieved 2022-03-16.
  6. ^ Official Python Docs, assert statement
  7. ^ "Warning Options (Using the GNU Compiler Collection (GCC))".
  8. ^ Goldstine and von Neumann. "Planning and Coding of problems for an Electronic Computing Instrument" Archived 2018-11-12 at the Wayback Machine. Part II, Volume I, 1 April 1947, p. 12.
  9. ^ Alan Turing. Checking a Large Routine, 1949; quoted in C. A. R. Hoare, "The Emperor's Old Clothes", 1980 Turing Award lecture.

Read other articles:

DoetinchemKota BenderaLambang kebesaranCountryNetherlandsProvinceGelderlandLuas(2006) • Total79,67 km2 (3,076 sq mi) • Luas daratan79,10 km2 (3,050 sq mi) • Luas perairan0,57 km2 (22 sq mi)Populasi (1 Januari 2012) • Total56.275 • Kepadatan706/km2 (1,830/sq mi) Source: CBS, Statline.Zona waktuUTC+1 (CET) • Musim panas (DST)UTC+2 (CEST) Doetinchem, church in the stre…

Segel Jacques de Vitry. Jacques de Vitry, C.R.S.A., (s. 1160/70 – 1 Mei 1240) adalah seorang kanonik regular Prancis yang menjadi seorang teolog dan pembuat kronik terkenal pada masanya. Ia dipilih menjadi uskup pada 1214 dan menjadi kardinal pada 1229. Biografi Jacques lahir di tengah Prancis (mungkin Reims) dan belajar di Universitas Paris, menjadi kanonik regular pada 1210 di Priorat Saint-Nicolas d'Oignies di Keuskupan Liège, sebuah jabatan yang ia pegang sampai ia dikonsekrasikan menjadi…

Bagian dari seri tentangHierarki Gereja KatolikSanto Petrus Gelar Gerejawi (Jenjang Kehormatan) Paus Kardinal Kardinal Kerabat Kardinal pelindung Kardinal mahkota Kardinal vikaris Moderator kuria Kapelan Sri Paus Utusan Sri Paus Kepala Rumah Tangga Kepausan Nunsio Apostolik Delegatus Apostolik Sindik Apostolik Visitor apostolik Vikaris Apostolik Eksarkus Apostolik Prefek Apostolik Asisten Takhta Kepausan Eparkus Metropolitan Batrik Uskup Uskup agung Uskup emeritus Uskup diosesan Uskup agung utam…

Bro & SisGenreInfotainmenNegara asalIndonesiaBahasa asliBahasa IndonesiaProduksiDurasi60 menitRumah produksiMotion Content GroupDistributorNet Visi MediaRilis asliJaringanNET.Format gambarHDTV (1080i 16:9)Format audioDolby Digital 5.1Rilis13 Februari (2023-02-13) –2 Juni 2023 (2023-6-2)Acara terkaitEntertainment News Hot News Hot NET. Hunting Cek Fakta Selebriti Update Potret Selebriti Hot Shot, Halo Selebriti, Status Selebritis, Bestie (SCTV) Silet, Trending Banget Loh, Go …

City in Nevada, United States City in Nevada, United StatesWinnemucca, NevadaCityDowntown Winnemucca viewed from Winnemucca MountainNickname: City of Paved Streets[1][2]Humboldt County and City of Winnemucca, NevadaWinnemuccaShow map of NevadaWinnemuccaShow map of the United StatesCoordinates: 40°58′6″N 117°43′36″W / 40.96833°N 117.72667°W / 40.96833; -117.72667CountryUnited StatesStateNevadaCountyHumboldtNamed forChief WinnemuccaGovernmen…

В состав Полтавской области Украины входят 15 городов. Русскоеназвание Украинскоеназвание Район Население,чел.[1] Основан Статусгорода Герб Координаты Гадяч Гадяч Миргородский 24 187 1533 1643 50°22′02″ с. ш. 33°59′20″ в. д.HGЯO Глобино Глобине Кременчугский 9 921 1737 1976 49°23…

1865 battle of the American Civil War 37°21′12.5″N 78°49′38.3″W / 37.353472°N 78.827306°W / 37.353472; -78.827306 Battle of Appomattox StationPart of the American Civil WarDateApril 8, 1865 (1865-04-08)LocationAppomattox County, VirginiaResult Union victory Subsequent battle at Appomattox Court House the following dayBelligerents United States (Union) Confederate States (Confederacy)Commanders and leaders George Armstrong CusterDavid Hunter Stro…

Pour les articles homonymes, voir Michel Guy (général), Guy et Giroud. Michel Guy Fonctions Secrétaire d'État à la Culture 8 juin 1974 – 27 août 1976(2 ans, 2 mois et 19 jours) Président Valéry Giscard d'Estaing Premier ministre Jacques Chirac Gouvernement Chirac I Prédécesseur Alain Peyrefitte (ministre) Successeur Françoise Giroud Biographie Nom de naissance Michel Georges Guy Date de naissance 28 juin 1927 Lieu de naissance 16e arrondissement de Paris Date de …

Taluk of the city district of Chennai in the Indian state of Tamil Nadu Aminjikarai taluk is a taluk of the city district of Chennai in the Indian state of Tamil Nadu. It was formed in December 2013 from parts of the erstwhile Perambur-Purasawalkam taluk and the Egmore-Nungambakkam taluk.[1] It comprises the neighbourhoods of Aminjikarai, Anna Nagar, Arumbakkam, Koyambedu, Thirumangalam, Vada Agaram and Villivakkam.[2] Perambur-Purasawalkam taluk Villivakkam Firka: Villivakkam, M…

Peng Dehuai Ministro della difesa nazionale della Repubblica Popolare CineseDurata mandatosettembre 1954 –aprile 1959 Predecessorecarica istituita SuccessoreLin Biao Dati generaliPartito politicoPartito Comunista Cinese ProfessioneMilitare Peng DehuaiPeng Dehuai in Corea nel 1950SoprannomePéng lǎozǒng, Vecchio Capo Peng, Grande Generale Peng NascitaXiangtan, 24 ottobre 1898 MortePechino, 29 novembre 1974 Dati militariPaese servito Cricca dello Hunan Cina…

Township in Illinois, United StatesCompromise TownshipTownshipLocation in Champaign CountyChampaign County's location in IllinoisCoordinates: 40°15′57″N 88°00′46″W / 40.26583°N 88.01278°W / 40.26583; -88.01278CountryUnited StatesStateIllinoisCountyChampaignArea • Total47.75 sq mi (123.7 km2) • Land47.75 sq mi (123.7 km2) • Water0 sq mi (0 km2)  0%Elevation709 ft (216…

Tambang tembaga di Prefektur Okayama Pertambangan di Jepang adalah industri yang terus menurun secara drastis sejak tahun 1980-an. Letak geografis Jepang di zona subduksi menyebabkan Jepang memiliki sumber daya mineral yang kaya, tetapi hanya sedikit memiliki minyak bumi dan gas alam. Produk pertambangan seperti batu bara, emas, perak, perunggu, besi, dan seng dieksploitasi secara besar-besaran hingga dekade 1970-an. Semakin menipisnya persediaan sumber daya tambang yang diikuti penurunan mutu d…

Синелобый амазон Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:ЗавропсидыКласс:Птиц…

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Oktober 2022. Wool Felt Sheets Felt adalah jenis kain yang dibuat dari serat wol tanpa ditenun, dibuat dengan proses pemanasan dan penguapan sehingga menghasilkan kain dengan beragam tekstur dan jenis.[1] Kain felt mudah dijumpai di pasaran, dengan harga yang r…

Liinamaa's Cabinet57th Cabinet of FinlandDate formed13 June 1975Date dissolved30 November 1975People and organisationsHead of stateUrho KekkonenHead of governmentKeijo LiinamaaMember partynoneHistoryPredecessorSorsa I CabinetSuccessorMiettunen II Cabinet Keijo Liinamaa's cabinet was the 57th government of Finland. The cabinet existed for 171 days, lasting from 13 June 1975 to 30 November 1975.[1] The Liinamaa cabinet was a caretaker government (Finnish: virkamieshallitus) drawn by Presid…

Voce principale: Associazione Calcistica Perugia Calcio. AC PerugiaStagione 1982-1983I giocatori biancorossi prima di una partita Sport calcio Squadra Perugia Allenatore Aldo Agroppi Presidente Franco D'Attoma Serie B11º Coppa ItaliaPrimo turno Maggiori presenzeCampionato: Ottoni (37) Miglior marcatoreCampionato: Pagliari (10) StadioRenato Curi 1981-1982 1983-1984 Si invita a seguire il modello di voce Questa voce raccoglie le informazioni riguardanti l'Associazione Calcio Perugia nell…

Fig. 1. Carte globale du stress hydrique et répartition du système des OFG, épaisseur et valeurs minimales de salinité. Les symboles carrés représentent une zone où l'épaisseur de l'OFG est inconnue Les eaux douces souterraines en mer ou eaux douces offshore (OFG pour (en) Offshore Freshened Groundwater) sont des eaux qui contiennent une concentration totale de solides dissous (TDS pour Total Dissolved Solid) inférieure à celle de l'eau de mer et qui sont hébergées dans des séd…

Wa'alaikumsalam ParisSutradaraBenni SetiawanProduser(Executive Producer) Yoen K, Ody Mulya HidayatDitulis olehBenni SetiawanPemeranVelove VexiaNino FernandezTanta GintingPenata musikJoseph S DjafarPerusahaanproduksiMaxima PicturesTanggal rilis17 Maret 2016Durasi106 menitNegaraIndonesiaBahasaIndonesia, Prancis Wa'alaikumussalam Paris merupakan film drama-komedi Indonesia yang dirilis pada 17 Maret 2016. Film ini dibintangi oleh Velove Vexia dan Nino Fernandez. Sinopsis Itje, gadis asal desa…

1853 memoir by Solomon Northup This article is about the 1853 memoir. For other uses, see Twelve Years a Slave (disambiguation). Twelve Years a Slave Illustration from Twelve Years a Slave (1855)AuthorDavid WilsonCountryUnited StatesLanguageEnglishGenreAutobiography, slave narrativePublisherDerby & Miller, Auburn, New York[1]Publication date1853[2]Media typePrint (hardcover)ISBN978-1843914716Dewey Decimal301.45TextTwelve Years a Slave at Wikisource Twelve Years a Slave i…

Jeffrey Kaplan Jeffrey Kaplan, noto anche con lo pseudonimo di Tigole (New Jersey, 4 novembre 1972), è un autore di videogiochi statunitense. Inizia la sua carriera lavorando per Blizzard Entertainment nel Maggio del 2002 come tester nel videogioco Warcraft 3[1]. Successivamente contribuì come world designer (dungeon, raid, quest) nel videogioco World of Warcraft[2] e nelle sue due espansioni, lavorando a stretto contatto con Chris Metzen e Pat Nagle. Nel 2009 Kaplan annuncia i…

Kembali kehalaman sebelumnya