Projet

Général

Profil

SOP 001-Programmation » Historique » Version 14

Patrice Nadeau, 2015-12-22 19:22

1 1 Patrice Nadeau
h1. SOP 001-Programmation
2
3
Mes standards autant au niveau du style que de la documentation.
4
5 11 Patrice Nadeau
La plate-forme (logiciel et matériel) est documenté dans le [[SOP_002-Environnement_informatique]].
6 1 Patrice Nadeau
7
{{lastupdated_at}} {{lastupdated_by}}
8
9
---
10
11
{{toc}}
12
13
h2. Diagrammes
14
15
Les représentations des différents processus d’un programme ou d’un circuit.
16
17
Les diagrammes DOIVENT être faits avec le logiciel Dia.
18
Ils PEUVENT être exportés en d’autre format.
19
20 14 Patrice Nadeau
h3. LibreOffice Draw
21
22
Icônes Cisco
23
* http://www.cisco.com/web/about/ac50/ac47/3015_jpeg.zip
24
25 1 Patrice Nadeau
h2. Système de gestion de version
26
27
Le logiciel "Git":http://www.git-scm.com/ DOIT être utilisé.
28
29
La version DOIT être en format: _majeur.mineur.revision_.
30
Les nombres majeur, mineur NE DOIVENT PAS contenir de zéro non significatif et DEVRAIT se limiter à deux chiffres.
31
32
Ex.
33
> Version 1.2.06
34
35
Les modifications DOIVENT se faire avec _git commit_, de la manière suivante :
36
* nom du fichier modifié,
37
* 1 espace,
38
* nom de l’item modifié entre parenthèses,
39
* un deux- points (<notextile>:</notextile>) sans espace avec l’item précédent,
40
* 1 espace,
41
* le texte du changement en anglais, commençant par une majuscule, au présent,
42
* un point (.)
43
44
Ex. :
45
> Modification ajouté manuellement
46
<pre><code class="bash">
47
git commit -m "usart.c (usart_Init): Add a new variable ctr."
48
</code></pre>
49
> Modification par un éditeur texte
50
<pre><code class="bash">
51
git commit
52
</code></pre>
53
54
Si les commit sont fait sans l’option *-m*, chaque fichier DOIT être séparé par une ligne vide.
55
56
h2. Code source
57
58
Les différents type de langage et de script décrit dans ce SOP.
59
60
h3. Généralités
61
62
h4. Langue
63
64
La langue (macros, variables, fonctions, commentaires, etc...) DOIT être l’anglais.
65
66
h4. Commentaires
67
68
Les commentaires DOIVENT être :
69
* sur la ligne précédent l’item à documenter
70
* en minuscules et commencer par une majuscule
71
72
73
h4. Nombre magique
74
75
L’utilisation de "nombre magique":http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Unnamed_numerical_constants ne DOIT PAS être utilisé directement dans le code.
76
Il DOIVENT être définis dans une macro ou une variable globale.
77
78
h2. C
79
80
Le langage C, version C99 (ISO/IEC 9899:1999) utilisé avec le compilateur GCC.
81
82
h3. Commentaires
83
84
Les commentaires ne devant pas être inclus dans une documentation, DOIVENT être de style « C » :
85
86
<pre><code class="c">
87
/* Une seule ligne... */
88
89
...
90
91
/*
92
* Sur
93
* plusieurs
94
* lignes
95
*/
96
</code></pre>
97
98
h3. Doxygen
99
100
Chaque item DOIT être documentés de manière à générer une documentation avec le logiciel "Doxygen":http://www.stack.nl/~dimitri/doxygen/index.html.
101
102
Seulement les items définis dans les fichiers d’en-tête sont documentés par défaut.
103
Un commentaire Doxygen commence par *<notextile> /** </notextile>* , le compilateur le comprenant comme un commentaire ordinaire.
104
105
Les règles typographiques du [[SOP_000-Documentation]] s’appliquent :
106
* Gras (*@b*) : Items devant être inscrit tel quel.
107
* Italique & emphase (*@e*) : Items à remplacer par un choix ou nécessitant une attention particulière.
108 10 Patrice Nadeau
109 9 Patrice Nadeau
> Doxygen version &ge; 1.8.8 : Le bogue "737472":https://bugzilla.gnome.org/show_bug.cgi?id=737472 oblige de forcer le langage de la fonction dans l’exemple si on ne veut pas de numéro de ligne.
110 1 Patrice Nadeau
111
Les items DOIVENT être inscrit dans cet ordre :
112
<pre><code class="c">
113
/**
114 6 Patrice Nadeau
* @brief Short description
115
* @param[in,out] var Description. @n Possible values :
116
* − @b value1
117
* − @b value2
118
* @return
119
* @retval @b value Description
120
* @par Example :
121 1 Patrice Nadeau
* Example Title
122 7 Patrice Nadeau
* @code{.c}
123 1 Patrice Nadeau
* ...
124
* @endcode
125
* @pre Requirements
126
* @post Changes after the call to this function
127
* @see See also ...
128
* @note
129
* @warning
130
* @bug
131
* @todo
132
*/
133
</code></pre>
134
135
Des *@todo*, *@warning* et *@bug* supplémentaires PEUVENT être ajoutés dans le code.
136
L’item *@brief* DOIT toujours exister.
137
138
h3. Code
139
140
Le code est dans le style K&R, variante 1TBS
141
* Le « tab » DOIT être équivalent à 4 espaces.
142
* Le « backslah » DOIT être utilisé pour les lignes de plus de 80 caractères.
143
* Une instruction par ligne.
144
* Un espace avant et après un opérateur sauf pour les opérateurs « "unary":http://en.wikipedia.org/wiki/Unary_operation ».
145
146
One True Brace Style
147
<pre><code class="c">
148
int fonction (void)
149
{
150
    int x;
151
    /* the comment goes here, before the loop */
152
    if (var != 1) {
153
        x = x + 1;
154
        y++;
155
        printf("This is a long\
156
        line that should be splitted");
157
    } else {
158
        /** @warning this is a Doxygen warning */
159
        x--;
160
    }
161
    return(0);
162
}
163
</code></pre>
164
165
h4. Fichier entête
166
167
Avertissement
168
>Le gabarit template.h DOIT être utilisé.
169
170
Les fichier « header » DOIVENT contenir les déclarations des fonctions, macros et la partie « mainpage » de Doxygen.
171
172
Le nom du fichier DOIT être composé de la manière suivante :
173
* en minuscule
174
* 8 caractères maximum
175
* l’extension DOIT être *.h*
176
177
Une définition macro DOIT être faite pour éviter de ré-inclure le fichier.
178
La macro DOIT être dans le format *_fichier_h*
179
<pre><code class="c">
180
#ifndef _usart_h
181
#define _usart_h
182
...
183
#endif /*_usart.h*/
184
</code></pre>
185
186
h4. Fichier source
187
188
Le nom du fichier DOIT être composé de la manière suivante :
189
* en minuscule
190
* 8 caractères maximum
191
* l’extension DOIT être *.c*
192
193
h4. Librairies
194
195
Fichiers comprenant plusieurs déclarations et définitions reliés entre eux.
196
197
* Le nom DOIT respecter les standards ([[SOP_001-Programmation#Fichiers-Entêtes|1]] & [[SOP_001-Programmation#Fichiers-Sources|2]]) et être significatifs.
198
* Un fichier d’entête DOIT toujours exister.
199
* Les items sont précédés du nom de la librairie (minuscule) et séparés par un « underscore » (_).
200
201
L’utilisation de macros DOIT être utilisé au lieu de constates globales.
202
Il NE DEVRAIT PAS exister de de variables globales.
203
204
h4. Déclarations locales
205
206
Une déclaration n’ayant qu’une visibilité locale DOIT être précédé d’un « underscore » (_) et être de classe *static*.
207
208
<pre><code class="c">
209
/**
210
* @brief Local function
211
**/
212
static void _LocalFunc(void)
213
{
214
...
215
return;
216
}
217
</code></pre>
218
219
h4. Items désuets
220
221
Les déclarations ne devant plus être utilisés, DOIVENT générer un message lors de la compilation (*-Wall*) si un appel est effectué.
222
223
L’attribut *<notextile> __attribute__((deprecated)) </notextile>* DOIT être ajouté à la déclaration.
224
La documentation DOIT indiquer les substituts à utiliser.
225
<pre><code class="c">
226
/**
227
* @brief OldFunction
228
* @detail will generate a warning if used
229
* @see @b NewFunction
230
*/
231
int OldFunction(void) __attribute__((deprecated));
232
</code></pre>
233
234
h4. Constantes
235
236
La déclaration DOIT inclure aussi la définition.
237
238
Utilisé au lieu d’une macro quand le type ou la visibilité de la variable doit être définis.
239
* En majuscule
240
* Séparé par un «underscore» (_) si contient plusieurs mots
241
* De classe _static_ ou _extern_ selon le besoin
242
243
<pre><code class="c">
244
/** 
245
 * @name List of constants
246
 * @{
247
 */
248
249
/**
250
* @brief Local const
251
*/
252
static int _PI = 3.15;
253
/**
254
* @brief The initialization string of the project
255
*/
256
static const char INIT_STR[6] = {'P', 'O', 'W', 'E', 'R'};
257
/**
258
* @brief Global const in the random library
259
*/
260
extern int random_MAX = 25;
261
262
/**
263
 * @}
264
 */
265
</code></pre>
266
267
h4. Typedef
268
269 12 Patrice Nadeau
Format
270
* En minuscule, suivie de *_t*
271
272 13 Patrice Nadeau
Définition de typedef
273 12 Patrice Nadeau
<pre><code class="c">
274
/** Unsigned integer 8 bits */
275
typedef unsigned int new_t
276
/** Type of structure in the ds1305 library */
277
typedef struct {
278
	/** @brief last two digits : &ge; 00, &le; 99 */
279
	uint8_t year;
280
	/** @brief 01 - 12 */
281
	uint8_t month;
282
	/** @brief 01 - 31 */
283
	uint8_t date;
284
	/** @brief 1 - 7 */
285
	uint8_t day;
286
	/** @brief 00 - 23 */
287
	uint8_t hours;
288
	/** @brief 00 - 59 */
289
	uint8_t minutes;
290
	/** @brief 00 - 59 */
291
	uint8_t seconds;
292
} ds1305_time_t;
293
</code></pre>
294 1 Patrice Nadeau
295
h4. Variables
296
297
Format
298
* En minuscule.
299
* Séparé par un « underscore » (_) si contient plusieurs mots.
300
301
Définition de variables
302
<pre><code class="c">
303
/** @brief Local variable */
304
int _ctr;
305
/** @brief Global variable from the random librairy */
306
int random_ctr;
307
</code></pre>
308
309
h4. Structures
310
311
Format
312
* En minuscule, séparé par des «underscores» si nécessaire.
313
314
Définition de structures
315
<pre><code class="c">
316
/**
317
* @brief Structure for a local menu
318
* @see MenuSelect
319
*/
320
struct menu {
321
/** @brief Character used for the item */
322
char choice;
323
/** @brief Description of the item */
324
char *item;
325
};
326
</code></pre>
327
328
h4. Fonctions
329
330
Le nom est formé d’une lettre majuscule pour chacune des premières lettres des mots.
331
332
Le nom DOIT être dans un deux formats suivants :
333
* ActionItemAttribut, où _Action_ signifie :
334 5 Patrice Nadeau
** *Get* : Lis un registre
335
** *Read*, *Write* : Lis ou écris dans un fichier
336
** *Set* : Écris une valeur prédéfini dans un registre
337
** *Init* : Fonction d’initialisation
338 1 Patrice Nadeau
* isItemEtat
339 5 Patrice Nadeau
** *is* : Verifie si _Item_ est dans l’état _Etat_
340 1 Patrice Nadeau
341
Exception
342
> Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver »). Dans ce cas, le nom définis dans le « datasheet » aura préséance. Ex. ReadRegister.
343
344
Une fonction DEVRAIT retourner une valeur. 
345
346
Dans le cas d'un « oui/non », la valeur DOIT être :
347
* Succès : *0* 
348
* Erreur : *1*
349
> L'utilisation d'un type booléen (*true* & *false*) est permise avec *<stbool.h>* (C99).
350
351
Dans le cas d'une fonction retournant un pointeur :
352
* Erreur : *NULL* 
353
* autre valeur  : adresse du pointeur
354
355
356
Définition de fonctions
357
<pre><code class="c">
358
/**
359
* @brief Check if a timer is set
360
* @param[in] nb Timer number. @n Possible values :
361
* − @b TIMER_1
362
* − @b TIMER_2
363
* @return
364
* @retval true Timer @e nb is set
365
* @retval false Timer @e nb is NOT set
366
* @par Example :
367
* Check if the timer is set
368
* @code{.c}
369
* ...
370
* result = isTimerSet();
371
* ...
372
* @endcode
373
* @pre TimerInit
374
**/
375
static bool isTimerSet(uint8_t nb);
376
/**
377
* @brief Set the led to green
378
**/
379
SetLedColor(GREEN);
380
/**
381
* @brief Set register of the chip XYZ
382
*
383
* The name does not follow the standards but does match the datatsheet
384
* This is a local function not meant to be called outside this librairy
385
**/
386
static void _WriteReg(void);
387
</code></pre>
388
389
h3. Macros
390
391
Les directives du préprocesseur C.
392
393
* Utilisé dans le code source et les fichiers entête.
394
* DOIT toujours commencer à la colonne 0.
395
396
h4. include
397
398
Pour inclure d’autres fichier comme les fichiers entête.
399
>N’est pas documenté dans Doxygen.
400
401
h4. ifdef / ifndef
402
403
Surtout utiliser pour des options de compilation sur différentes plateforme.
404
>N’est pas documenté dans Doxygen.
405
406
<pre><code class="c">
407
#ifndef usart_AVR
408
#error "usart.h is not supported on this AVR !"
409
#endif
410
</code></pre>
411
412
h4. error
413
414
Affiche une erreur et arrête la compilation
415
>N’est pas documenté dans Doxygen.
416
417
<pre><code class="c">
418
#ifndef __test__
419
#error "Error !"
420
#endif
421
</code></pre>
422
423
h4. #warning
424
425
Affiche une erreur mais n’arrête la compilation
426
>N’est pas documenté dans Doxygen.
427
428
<pre><code class="c">
429
#ifndef __test__
430
#warning "Warning !"
431
#endif
432
</code></pre>
433
434
h4. define 
435
436
Définis une valeur au moment de la compilation.
437
* Format
438
** En majuscule.
439
** Séparé par un «underscore» si contient plusieurs mots.
440
* Doxygen
441
** @brief
442
** @name pour les listes de macros (regroupement dans la documentation)
443
444
Définition de macros
445
<pre><code class="c">
446
/**
447
* @name Mathematical macros listed together
448
* @{
449
*/
450
/** @brief Value for PI */
451
#define _PI 3.14
452
/** @brief Another number */
453
#define _MAGIC_NUMBER 42
454
/**
455
* @}
456
*/
457
/** @brief Even parity */
458
#define usart_PARITY_EVEN 'e'
459
</code></pre>
460
461
h3. Atmel AVR
462
463
Particularités pour les micro-contrôleurs AVR d’Atmel.
464
465
* Progmem : Pour mettre une fonction en Flash au lieu de SRAM.
466
** Le nom de la fonction est suivie de *_P*.
467
* main : Ne revient jamais à un niveau supérieur.
468
** Définir la fonction main avec l’attribut *noreturn*.
469 3 Patrice Nadeau
** La boucle sans fin la plus optimisé est le *for (;;)*.
470 1 Patrice Nadeau
* Atomic : Opérations ne devant pas être interrompus.
471
472
Particularités pour AVR
473
<pre><code class="c">
474
/**
475
* @brief Progmem function
476
* @return An unsigned 8 bits integer
477
*/
478
uint_8t PrintString_P()
479 4 Patrice Nadeau
480 1 Patrice Nadeau
/* main function */
481
void main(void) __atribute__((noreturn))
482
{
483
    ...
484
    /* never return */
485
    for (;;) {
486
    }
487
}
488
489
/* atomic operations */
490
#ifndef S_SPLINT_S
491
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
492
/* 
493
* operations that must not be interupted
494
* like loading a 16 bit register with a 8 bit register 
495
*/
496
}
497
#endif
498
</code></pre>
499
500
h3. Distribution
501
502
Les fichiers suivants DOIVENT être inclus dans une distribution en format *tar.gz*.
503
* ChangeLog
504
* README
505
* Files.lst
506
* Makefile
507
* Makefile.mk
508
* LICENSE.txt
509
* *.c
510
* *.h
511
* projet.pdf (généré par Doxygen)
512
513
Avec mon makefile :
514
<pre><code class="bash">
515
make dist
516
</code></pre>
517
518
h3. Modifications
519
520
Un changement à un fichier (source ou en-tête), doit se refléter dans _Git_.
521
522
Chaque changement est fait avec :
523
<pre><code class="bash">
524
git add nom_fichier
525
git commit
526
</code></pre>
527
528
La ligne DOIT 
529
* être au temps présent
530
* être en anglais
531
* se termine par un point
532
* être dans le format suivant :
533
> La partie _section_ est facultative
534
535
<pre><code class="text">
536
fichier1 (fonction) <section>: 
537
Ajoute une description au temps présent.
538
Décrire les bogues réglés si il y en avaient.
539
</code></pre>
540
541
h3. Changelog
542
543
La somme de toutes les modification doivent apparaitre dans un fichier « changelog ».
544
> Le standard seras celui GNU : http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
545
546
Ce fichier doit s'appeler *ChangeLog* et DOIT être généré à partir de _Git_ (les doubles espaces ne sont pas une erreur de frappe :
547
<pre><code class="bash">
548
git log --no-merges --format="%ad  %an  <%aE> %n * %B" --date=short > ChangeLog
549
</code></pre>
550
551
h3. Validation du code
552
553
Le logiciel _splint_ est utilisé.
554
* Un « typecast » DOIT être utilisé lorsque détecté.
555
* L’utilisation du typecast *void* DOIT être utilisé lorsque qu’une fonction retourne un résultat non utilisé.
556
557
h2. Makefile
558
559
h2. Nagios
560
561
h3. Plugins
562
563
https://nagios-plugins.org/doc/guidelines.html
564
565
Un message d'une ligne (< 80 caractères) DOIT être retourné via _STDOUT_ dans le format
566
> *SERVICE STATUS:* texte
567
568
Les codes de retour sont les suivants:
569
|_. Valeur |_. Service Status |_. Description |
570
| 0 | OK | Le service fonctionne |
571
| 1 | Warning | Le service fonctionne, problème avec le seuil de la valeur _Warning_ |
572
| 2 | Critical | Le service ne fonctionne pas ou problème avec le seuil de la valeur _Critical_  |
573
| 3 | Unknow | Arguments non valides ou erreur interne (fork, tcp socket)|
574
575
Les arguments suivants DOIVENT être fournis
576
* *-H* (*--hostname*) :
577
* *-w* (*--warning*) :
578
* *-c* (*--critical*) :
579
* *-V* (*--version*) :
580
* *-h* (*--help*) :
581
582
L'argument _--help_ DOIT aussi appeler l'argument _--version_.
583
584
En _C_, les fonctions suivantes DOIT être utilisées :
585
* _print_revision_ (utils.c)
586
* _print_help_
587
* _getopt_long_ (getopt.h)
588
589
h2. Puppet
590
591
h3. Généralités
592
593
Inspiré des recommandations disponible au http://docs.puppetlabs.com/guides/style_guide.html.
594
* Tabulation : 2 espaces
595
*  Largeur : 80 caractères (« backslah » (\) pour séparer une longue ligne).
596
* Commentaires : Style #
597
* Guillemets
598
** Simple : Pour une « string » sans variables.
599
** Double : Pour une « string » avec variables ayant besoin d’être extrapolé.
600
*** La variable doit être entourée des symboles *<notextile>{</notextile>* et *<notextile>}</notextile>*.
601
* Nom des ressources : DOIVENT être entouré du symbole *<notextile> ’ </notextile>*.
602
* Alignement de => : DOIT être aligné dans un même paragraphe.
603
* Ordre : Si l’attribut _ensure_ doit être inclus, il DOIT être le premier.
604
* Lien symbolique : DOIT être déclaré avec *ensure => link*
605
606
Ex. :
607
<pre><code class="ruby">
608
file { '/var/log/syslog':
609
ensure => link,
610
target => '/var/log/messages',
611
}
612
</code></pre>
613
614
* File mode : 
615
** 4 chiffres
616
** simple guillemet
617
* Variables
618
** lettres
619
** chiffres
620
** « underscore »
621
622
h3. Documentation
623
624
http://docs.puppetlabs.com/learning/modules2.html#module-documentation
625
626
Format Rdoc (http://rdoc.rubyforge.org/RDoc/Markup.html)
627
* Bloc de commentaires qui commence sur la première ligne du fichier
628
* Titre avec le symbole *<notextile>=</notextile>*
629
* Séparation avec le symbole *<notextile>-</notextile>*
630
* Emphase (mot entouré du symbole)
631
** * : gras
632
** _ : souligné
633
** + : Police de caractères pour le code
634
* Sections
635
** = Class:
636
** == Parameters:
637
** == Requires:
638
** == Sample Usage:
639
* Classe
640
** Une classe par fichier « manifest »
641
642
h2. Script
643
644
h3. Bash
645
646
<pre><code class="bash">
647
#/bin/bash
648
649
function print_revision {
650
}
651
652
function print_help {
653
    print_revision
654
}
655
</code></pre>
656
657
h3. Perl
658
659
<pre><code class="perl">
660
661
</code></pre>
662
663
h3. PowerShell
664
665
Version 4.0. Supporte :
666
* Windows 8.1 (natif)
667
* Windows Server 2012 R2 (natif)
668
* Windows 7 SP1
669
* Windows Server 2008 R2 SP1
670
* Windows Server 2012
671
672
h4. Fichier
673
674
Le fichier DOIT être composé de la manière suivante :
675
* L’extension est .ps1
676
* Une longue ligne peux être séparée avec un « back tick » (‘).
677
678
h4. Commentaires
679
680
L’aide est accéder par _Get-Help_
681
<pre>
682
#REQUIRES -Version 2.0
683
<#
684
.SYNOPSIS
685
A brief description of the function or script.
686
This keyword can be used only once in each topic.
687
.DESCRIPTION
688
A detailed description of the function or script.
689
This keyword can be used only once in each topic.
690
.NOTES
691
File Name
692
: xxxx.ps1
693
Author
694
:
695
Prerequisite
696
: PowerShell V2 over Vista and upper.
697
Copyright 2011 -
698
.LINK
699
Script posted over:
700
http://
701
.EXAMPLE
702
Example 1
703
.EXAMPLE
704
Example 2
705
#>
706
</pre>
707
708
h2. Vim
709
710
* Entête (en commentaires)
711
** Titre
712
** Last Change:
713
** Maintainer:
714
** License: This file is placed in the public domain.
715
* Autre mots reconnus
716
** BUG: (Error:)
717
** TODO:
718
** Note:
719
** FIXME
720
721
h2. Références
722
723
Références ayant servis à ce document.
724
725
"ChangeLog":http://www.gnu.org/prep/standards/html_node/Change-Logs.html#Change-Logs
726
"GNU deprecated attribute":http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html